2017-07-27 51 views
0

我已经得到了多列的csv文件,其中一个是日期的日期,下一个是时间,然后有一个与像这样的毫秒:熊猫解析从毫秒三个字段

DATE  TIME  MSEC 
0 13/01/2017 08:49:37 805102  
1 13/01/2017 08:49:09 675839  
2 13/01/2017 08:39:03 50614  
3 13/01/2017 08:38:30 383081 

现在我真的很感动,我可以用大熊猫的日期和时间结合起来阅读csv文件就像

pd.read_csv(r"~/file.csv", parse_dates=[["DATE","TIME"]]) 

的时候,但我似乎不能在毫秒挤也。由于该文件非常大,如果可以在read_csv中完成而不是在连续的步骤中完成,那么该文件将非常有用。

回答

1

UPDATE:从上飞不同的列读取CSV时解析日期:

In [181]: pd.read_csv(fn, 
         date_parser=lambda d,t,ms: d + ' ' + t + '.' + ms, 
         parse_dates={'Timestamp':['DATE','TIME','MSEC']}) 
Out[181]: 
        Timestamp 
0 2017-01-13 08:49:37.805102 
1 2017-01-13 08:49:09.675839 
2 2017-01-13 08:39:03.506140 
3 2017-01-13 08:38:30.383081 

OLD答案:

首先阅读您的CSV,因为它是:

df = pd.read_csv(r"~/file.csv") 

In [170]: df 
Out[170]: 
     DATE  TIME MSEC 
0 13/01/2017 08:49:37 805102 
1 13/01/2017 08:49:09 675839 
2 13/01/2017 08:39:03 50614 
3 13/01/2017 08:38:30 383081 

In [171]: df.dtypes 
Out[171]: 
DATE object 
TIME object 
MSEC  int64 
dtype: object 

now我们可以把它转换:

In [172]: df['TimeStamp'] = pd.to_datetime(df.DATE + ' ' + df.TIME + '.' + df.MSEC.astype(str), format='%d/%m/%Y %H:%M:%S.%f') 

In [173]: df 
Out[173]: 
     DATE  TIME MSEC     TimeStamp 
0 13/01/2017 08:49:37 805102 2017-01-13 08:49:37.805102 
1 13/01/2017 08:49:09 675839 2017-01-13 08:49:09.675839 
2 13/01/2017 08:39:03 50614 2017-01-13 08:39:03.506140 
3 13/01/2017 08:38:30 383081 2017-01-13 08:38:30.383081 


In [174]: df.dtypes 
Out[174]: 
DATE     object 
TIME     object 
MSEC     int64 
TimeStamp datetime64[ns] 
dtype: object 

时序:

In [186]: df = pd.concat([df] * 10**3, ignore_index=True) 

In [187]: df.shape 
Out[187]: (4000, 3) 

In [188]: df.to_csv(fn, index=False) 

In [189]: pd.options.display.max_rows = 6 

In [190]: df 
Out[190]: 
      DATE  TIME MSEC 
0  13/01/2017 08:49:37 805102 
1  13/01/2017 08:49:09 675839 
2  13/01/2017 08:39:03 50614 
...   ...  ...  ... 
3997 13/01/2017 08:49:09 675839 
3998 13/01/2017 08:39:03 50614 
3999 13/01/2017 08:38:30 383081 

[4000 rows x 3 columns] 

In [191]: %%timeit 
    ...: pd.read_csv(fn, 
    ...:    date_parser=lambda d,t,ms: d + ' ' + t + '.' + ms, 
    ...:    parse_dates={'Timestamp':['DATE','TIME','MSEC']}) 
    ...: 
1 loop, best of 3: 3.31 s per loop 

In [192]: %%timeit 
    ...: df = pd.read_csv(fn) 
    ...: df['TimeStamp'] = pd.to_datetime(df.pop('DATE') + ' ' + 
    ...:         df.pop('TIME') + '.' + 
    ...:         df.pop('MSEC').astype(str), 
    ...:         format='%d/%m/%Y %H:%M:%S.%f') 
    ...: 
10 loops, best of 3: 122 ms per loop 

结论:读CSV,因为它是从数据帧解析日期是快27倍的4.000的行数据集。

+0

非常酷,谢谢 - 但有没有在read_csv中做到这一点的方法? – Magellan88

+0

@ Magellan88,最有可能的是,但我认为它会比这种方法更慢...... – MaxU

+0

@ Magellan88,你想在最后只有一列吗? – MaxU