日期时间处理 201/12/26
# parse_dates,date_parser 指定列的日期/时间格式,将文本数据转换为datetime
目录:
第1部分:csv文本文件读写
pandas 读csv文件read_csv(1.文本读写概要)
pandas 读csv文件read_csv(2.read_csv参数介绍)
pandas 读csv文件read_csv(3.dtypes指定列数据类型)
pandas 读csv文件read_csv(4.to_csv文本数据写)
pandas 读csv文件read_csv(5.文本数据读写实例)
pandas 读csv文件read_csv(6.命名和使用列)
pandas 读csv文件read_csv(7.索引)
pandas 读csv文件read_csv(8.方言和分隔符)
pandas 读csv文件read_csv(9.浮点转换和NA值)
pandas 读csv文件read_csv(10.注释和空行)
pandas 读csv文件read_csv(11.日期时间处理)
pandas 读csv文件read_csv(12.迭代和块)
pandas 读csv文件read_csv(13.read_fwf读固定宽度数据)
第2部分:
pandas hdf文件读写简要
pandas excel读写简要
第3部分:
python中csv模块用法tcy
pandas读csv文件read_csv错误解决办法7种
pandas to_string用法
实例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倍。