熊猫:使用read_csv

时间:2017-07-13 20:43:50

标签: python pandas parsing datetime dataframe

我有一个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'

我很困惑因为:

  1. 我将dict传递给parse_dates以将不同的列解析为单个日期。
  2. 我正在使用:%b - 缩写的月份名称,%d - 每月的某一天,%Y年与世纪,%H 24小时,{ {1}} - 分钟,%M - 秒
  3. 任何人都能看到我做错了什么?

    修改

    我已尝试%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倍。

2 个答案:

答案 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')