我有一个ascii文件,其日期格式如下:
Jan 20 2015 00:00:00.000
Jan 20 2015 00:10:00.000
Jan 20 2015 00:20:00.000
Jan 20 2015 00:30:00.000
Jan 20 2015 00:40:00.000
将文件加载到pandas中时,上面的每一列都会在pandas数据帧中获得自己的列。我尝试过以下各种变体:
from pandas import read_csv
from datetime import datetime
df = read_csv('file.txt', header=None, delim_whitespace=True,
parse_dates={'datetime': [0, 1, 2, 3]},
date_parser=lambda x: datetime.strptime(x, '%b %d %Y %H %M %S'))
我收到了一些错误:
TypeError: <lambda>() takes 1 positional argument but 4 were given
ValueError: time data 'Jun 29 2017 00:35:00.000' does not match format '%b %d %Y %H %M %S'
我很困惑因为:
parse_dates
以将不同的列解析为单个日期。 %b
- 缩写的月份名称,%d
- 每月的某一天,%Y
年与世纪,%H
24小时,{ {1}} - 分钟,%M
- 秒任何人都能看到我做错了什么?
修改
我已尝试%S
返回date_parser=lambda x: datetime.strptime(x, '%b %d %Y %H:%M:%S')
编辑2:
我尝试了@MaxU在他的更新中提出的建议,但这是有问题的,因为我的原始数据的格式如下:
ValueError: unconverted data remains: .000
我只对前7列感兴趣所以我用以下内容导入我的文件:
Jan 1 2017 00:00:00.000 123 456 789 111 222 333
然后,我尝试从前4列创建一个包含日期时间信息的列:
df = read_csv(fn, header=None, delim_whitespace=True, usecols=[0, 1, 2, 3, 4, 5, 6])
然而,这不起作用,因为df['datetime'] = to_datetime(df.ix[:, :3], format='%b %d %Y %H:%M:%S.%f')
期望&#34;整数,浮点数,字符串,日期时间,列表,元组,1-d数组,系列&#34;作为第一个参数,to_datetime
返回具有以下格式的数据框:
df.ix[:, :3]
如何将前四列的每一行都输入 0 1 2 3
0 Jan 1 2017 00:00:00.000
,以便获得一列to_datetime
?
编辑3:
我想我解决了第二个问题。
我只是使用以下命令并在我读取文件时执行所有操作(我基本上只是缺少datetimes
来解析过去的秒数):
%f
我希望手动解析而不是让pandas像@MaxU建议的那样处理它的全部原因是看看手动输入指令是否会更快 - 它就是!从我的测试中,上面的代码片段大约比让pandas推断为你解析的速度快5-6倍。
答案 0 :(得分:4)
采用这种更简单的方法:
df = pandas.read_csv('file.txt')
df.columns = ['date']
df
应该是一个包含单列的数据框。之后尝试将该列转换为datetime
df['date'] = pd.to_datetime(df['date'])
答案 1 :(得分:2)
Pandas(使用0.20.1版测试)非常聪明,可以为您完成:
In [4]: pd.read_csv(fn, sep='\s+', parse_dates={'datetime': [0, 1, 2, 3]})
Out[4]:
datetime
0 2015-01-20 00:10:00
1 2015-01-20 00:20:00
2 2015-01-20 00:30:00
3 2015-01-20 00:40:00
更新:如果所有条目的格式相同,您可以尝试这样做:
df = pd.read_csv(fn, sep='~', names=['datetime'])
df['datetime'] = pd.to_datetime(df['datetime'], format='%b %d %Y %H:%M:%S.%f')