2017-07-27 48 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