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

日期时间处理 201/12/26 
   
# 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倍。  

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/85292925