pandas21 读csv文件read_csv(11.日期时间)(详细 tcy)

本文转自:https://blog.csdn.net/tcy23456/article/details/85292925

仅为本人学习笔记之用,如有需求,请联系该文原作者。

   
# parse_dates,date_parser 指定列的日期/时间格式,将文本数据转换为datetime
目录:
第1部分:csv文本文件读写
 
    pandas 读csv文件read_csv(1.文本读写概要)https://mp.csdn.net/postedit/85289371
    pandas 读csv文件read_csv(2.read_csv参数介绍)https://mp.csdn.net/postedit/85289928
    pandas 读csv文件read_csv(3.dtypes指定列数据类型)https://mp.csdn.net/postedit/85290575
    pandas 读csv文件read_csv(4.to_csv文本数据写)https://mp.csdn.net/postedit/85290962
    pandas 读csv文件read_csv(5.文本数据读写实例)https://mp.csdn.net/postedit/85291123
    pandas 读csv文件read_csv(6.命名和使用列)https://mp.csdn.net/postedit/85291430
    pandas 读csv文件read_csv(7.索引)https://mp.csdn.net/postedit/85291658
    pandas 读csv文件read_csv(8.方言和分隔符)https://mp.csdn.net/postedit/85291994
    pandas 读csv文件read_csv(9.浮点转换和NA值)https://mp.csdn.net/postedit/85292391
    pandas 读csv文件read_csv(10.注释和空行)https://mp.csdn.net/postedit/85292609
    pandas 读csv文件read_csv(11.日期时间处理) https://mp.csdn.net/postedit/85292925
    pandas 读csv文件read_csv(12.迭代和块)https://mp.csdn.net/postedit/85293639
    pandas 读csv文件read_csv(13.read_fwf读固定宽度数据)https://mp.csdn.net/postedit/85294010
    
第2部分:
    pandas hdf文件读写简要https://mp.csdn.net/postedit/85294299
    pandas excel读写简要https://mp.csdn.net/postedit/85294545
    
第3部分:
    python中csv模块用法tcy https://mp.csdn.net/postedit/85228189
    pandas读csv文件read_csv错误解决办法7种https://mp.csdn.net/postedit/85228808
    pandas to_string用法https://mp.csdn.net/postedit/85294935
实例1:parse_dates=True解析所有列:

# 实例1.1:parse_dates=True解析所有列
# Use a column as an index, and parse it as dates.
from io import StringIO
 
data='date A B C\n' \
     '2018-12-21 a 1 2\n' \
     '2018-12-22 b 3 4\n' \
     '2018-12-23 c 4 5'
df = pd.read_csv(StringIO(data),sep=r'\s+', index_col=0, parse_dates=True,engine='python')
 
# 实例1.2:parse_dates=[1,2,3]将2,3,4列分别作为日期解析
pd.read_csv(StringIO(data), header=None, parse_dates=[1, 2,3],infer_datetime_format=True)
 
    0          1        2        3    4
0 tcy 2019-01-27 19:00:00 18:56:00  0.81#2列解析为日期,3,4列不能解析
1 tcy 2019-01-27 20:00:00 19:56:00  0.01
2 tcy 2019-01-27 21:00:00 20:56:00 -0.59
3 tcy 2019-01-27 21:00:00 21:18:00 -0.99
4 tcy 2019-01-27 22:00:00 21:56:00 -0.59
5 tcy 2019-01-27 23:00:00 22:56:00 -0.59
 
# 实例1.3:parse_dates=[[1, 2], [1, 3]]多列组合在一起成为日期
# 结果日期列将添加到输出前,新列名称将是组件列名称的串联
 
data='tcy,20190127, 19:00:00, 18:56:00, 0.81\n' \
     'tcy,20190127, 20:00:00, 19:56:00, 0.01\n' \
     'tcy,20190127, 21:00:00, 20:56:00, -0.59\n' \
     'tcy,20190127, 21:00:00, 21:18:00, -0.99\n' \
     'tcy,20190127, 22:00:00, 21:56:00, -0.59\n' \
     'tcy,20190127, 23:00:00, 22:56:00, -0.59'
 
df = pd.read_csv(StringIO(data), header=None, parse_dates=[[1, 2], [1, 3]])
 
                  1_2                 1_3   0     4
0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy  0.81
1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy  0.01
2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59
3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99
4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59
5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59
 
# 实例1.4:使用dict指定自定义名称列,组合时间:
# 传递dict作为parse_dates参数时,不保证前置列的顺序,因为dict对象不对其键强加排序。
# 可用collections.OrderedDict而不是常规字典。
 
date_spec = {'nominal': [1, 2], 'actual': [1, 3]}
df = pd.read_csv(StringIO(data), header=None, parse_dates=date_spec)
 
              nominal              actual   0    4
0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy  0.81
1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy  0.01
2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59
3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99
4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59
5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59 
实例2:

# 实例2.1:keep_date_col=True
# 默认解析器删除组件日期列,可选择keep_date_col保留它们:
df = pd.read_csv(StringIO(data), header=None, parse_dates=[[1, 2], [1, 3]], keep_date_col=True)
 
                  1_2                 1_3   0        1        2        3    4
0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy 20190127 19:00:00 18:56:00  0.81
1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy 20190127 20:00:00 19:56:00  0.01
2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy 20190127 21:00:00 20:56:00 -0.59
3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy 20190127 21:00:00 21:18:00 -0.99
4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy 20190127 22:00:00 21:56:00 -0.59
5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy 20190127 23:00:00 22:56:00 -0.59
 
#实例2.2:index_col 基于新位置:用作行索引的列编号或列名
# 将'parse_dates'的dict与index_col参数一起使用时,最好将index_col指定为列标签,而不是作为结果帧的索引。
 
date_spec = {'nominal': [1, 2], 'actual': [1, 3]}
df = pd.read_csv(StringIO(data), header=None, parse_dates=date_spec,index_col=0) # nominal 列日期作为行索引
 
                                 actual   0     4
nominal
2019-01-27 19:00:00 2019-01-27 18:56:00 tcy  0.81
2019-01-27 20:00:00 2019-01-27 19:56:00 tcy  0.01
2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59
2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99
2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59
2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59  
实例3:date_parser日期解析函数 

#3.1 单列转换
dateparse = lambda x: pd.datetime.strptime(x, ' %H:%M:%S')
date_spec = { 'time1': [2], 'time2': [3]}
df = pd.read_csv(StringIO(data), parse_dates=date_spec, date_parser=dateparse,header=None)
 
                time1               time2   0        1    4
0 1900-01-01 19:00:00 1900-01-01 18:56:00 tcy 20190127  0.81
1 1900-01-01 20:00:00 1900-01-01 19:56:00 tcy 20190127  0.01
2 1900-01-01 21:00:00 1900-01-01 20:56:00 tcy 20190127 -0.59
3 1900-01-01 21:00:00 1900-01-01 21:18:00 tcy 20190127 -0.99
4 1900-01-01 22:00:00 1900-01-01 21:56:00 tcy 20190127 -0.59
5 1900-01-01 23:00:00 1900-01-01 22:56:00 tcy 20190127 -0.59
 
# 3.2 多列转换
#方法1:
import pandas.io.date_converters as conv
date_spec = {'date1': [1, 2], 'date2': [1, 3]}
df = pd.read_csv(StringIO(data), header=None, parse_dates=date_spec,
index_col='date1',date_parser=conv.parse_date_time)
 
#方法2:
dateparse = lambda x: pd.datetime.strptime(x, '%Y%m%d %H:%M:%S')
dateparse = lambda x: pd.to_datetime(x,format='%Y%m%d %H:%M:%S',errors='ignore')# 知道日期格式
 
df = pd.read_csv(StringIO(data),header=None, parse_dates=date_spec ,
index_col='date1', date_parser=dateparse)#date1’列作为索引
 
                                    date2   0    4
date1
0 2019-01-27 19:00:00 2019-01-27 18:56:00 tcy  0.81
1 2019-01-27 20:00:00 2019-01-27 19:56:00 tcy  0.01
2 2019-01-27 21:00:00 2019-01-27 20:56:00 tcy -0.59
3 2019-01-27 21:00:00 2019-01-27 21:18:00 tcy -0.99
4 2019-01-27 22:00:00 2019-01-27 21:56:00 tcy -0.59
5 2019-01-27 23:00:00 2019-01-27 22:56:00 tcy -0.59
 
# 如格式非标准,用自定义date_parser功能。为了获得最佳性能,应该进行矢量化,即它应该接受数组作为参数。
# 您可以在date_converters.py中浏览日期解析功能 并添加自己的日期解析功能 。
# date_converters.py包含解析双日期和时间列,年/月/日列以及年/月/日/小时/分/秒列的函数。
 
# 它还包含一个 generic_parser函数,因此您可以使用一个函数处理它,该函数处理单个日期而不是整个数组。
 
实例4:推断格式infer_datetime_format=True 

# 使用条件:parse_dates启用;字符串的格式相同;获得较大的加速
 
可猜到日期:
# “20181230”“2018/12/30”“20181230 00:00:00”“12/30/2018 00:00:00”
# “30 / Dec / 2018 00:00:00”“30 / December / 2018 00:00:00”
 
dayfirst=True  # 猜测“01/12/2018”是12月1日。
dayfirst=False #(默认)猜测“01/12/2018”为1月12日。
 
# Try to infer the format for the index column
data=' date A B C\n' \
     '2018-01-01 a 1 2\n' \
     '2018-01-02 b 3 4\n' \
     '2018-01-03 c 4 5 '
 
pd.read_csv(StringIO(data), index_col=0,sep='\s+',engine='python',
parse_dates=True,infer_datetime_format=True)
 
           A B C
date
2018-01-01 a 1 2
2018-01-02 b 3 4
2018-01-03 c 4 5  
实例5:dayfirst国际日期格式 

# 日期格式MM / DD / YYYY美国,DD / MM / YYYY
data=' date,value,cat\n' \
     '1/6/2018,5,a\n' \
     '2/6/2018,10,b\n' \
     '3/6/2018,15,c'
df=pd.read_csv(StringIO(data), parse_dates=[0])
 
        date value cat
0 2018-01-06    5   a #1月6日
1 2018-02-06   10   b
2 2018-03-06   15   c
df[' date'].dt.day
Out[60]: 
0    6
1    6
2    6
Name:  date, dtype: int64   
df[' date'].dt.month
Out[61]: 
0    1
1    2
2    3    
df=pd.read_csv(StringIO(data),dayfirst=True, parse_dates=[0])
    
        date  value cat
0 2018-06-01      5   a #6月1日
1 2018-06-02     10   b
2 2018-06-03     15   c  
df.columns          # Index([' date', 'value', 'cat'], dtype='object')
df=pd.read_csv(StringIO(data), parse_dates=[0],skipinitialspace=True)#删除分隔符前后空白
df.columns          #Index(['date', 'value', 'cat'], dtype='object')
实例6: 

data='date time value\n' \
     '2018-12-26 09:40:18 48.1\n' \
     '2018-12-27 09:40:19 47.33\n' \
     '2018-12-28 09:40:20 42.27'
 
df= pd.read_csv(StringIO(data),sep='\s+', engine='python')
 
pd.to_datetime(df.date+df.time,format='%Y-%m-%d%H:%M:%S')#结果同下
(df.date+df.time).apply(lambda x:datetime.datetime.strptime(x, '%Y-%m-%d%H:%M:%S'))
 
0 2018-12-26 09:40:18
1 2018-12-27 09:40:19
2 2018-12-28 09:40:20
dtype: datetime64[ns]  
实例7: 综合日期 

data=' date A B C D\n' \
     '0 2019-01-01 0.26 -0.39 -0.21 1.18\n' \
     '1 2019-01-02 -1.17 -0.34 0 -0.2\n' \
     '2 2019-01-03 -1.73 0.53 2.0 -0.51\n' \
     '3 2019-01-04 -1.5 1.45 0.23 -1.15'
 
dateparse = lambda x: pd.datetime.strptime(x,'%Y-%m-%d')
df=pd.read_csv(StringIO(data),sep =r'\s+',engine='python',      #空格分割
               parse_dates = [ 'date' ],date_parser=dateparse,  #指定date列的日期格式
               dayfirst = True,                                 #推断日期为月,日
               index_col =0,                                    #第一列用作索引
               na_values=['NO CLUE', 'N/A', '0'],               #0被替换为Na值
               dtype={'D': int})                                #D列的数据为int
 
          date     A     B     C  D
NaN 2019-01-01  0.26 -0.39 -0.21  1
1.0 2019-01-02 -1.17 -0.34  NaN   0#1月2日
2.0 2019-01-03 -1.73  0.53  2.00  0
3.0 2019-01-04 -1.50  1.45  0.23 -1 
注意: 

1)如果列或索引包含不可解析的日期,则整个列或索引将作为对象数据类型以不变的方式返回。
2)对于非标准日期时间解析,请to_datetime()在之后使用pd.read_csv。
3)read_csv有一个fast_path,用于解析iso8601格式日期时间字符串,如“2018-01-01T00:01:02 + 00:00”和类似的变体。
 
如果您可以安排数据以此格式存储日期时间,则加载时间将显着加快,已观察到约20倍。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值