2017-07-27 1 views
0

ich eine CSV-Datei mit mehreren Spalten haben, von denen das Datum ist, ist der nächste der Zeit, und dann gibt es eine mit den miliseconds etwa so:Pandas analysieren stammt aus drei Feldern mit Millisekunden

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 

Jetzt bin ich wirklich beeindruckt, dass ich Pandas können das Datum und die Zeit, zu kombinieren, wenn die cSV-Datei zu lesen wie

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

aber ich kann nicht so gut in den Millisekunden zu drücken scheinen. Da die Datei ziemlich groß ist, wäre ich sehr dankbar, wenn dies auch in read_csv statt in einem fortlaufenden Schritt gemacht werden könnte.

Antwort

1

UPDATE: Parsing Datum aus verschiedenen Spalten im Fluge, wenn CSV-Lesen:

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 

ALTE Antwort:

zuerst Ihre CSV lesen, wie es ist:

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 

jetzt

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 

ZEITPLAN:

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 

Fazit: wir können es konvertieren Lesen CSV, wie es ist und das Parsen stammen aus dem Datenrahmen war 27-mal schneller für gesetzt 4.000 Zeilen Daten.

+0

Sehr cool, danke - aber gibt es eine Möglichkeit, dies in read_csv zu tun? – Magellan88

+0

@ Magellan88, wahrscheinlich ja, aber ich denke, es wird langsamer sein, im Vergleich zu diesem Ansatz ... – MaxU

+0

@ Magellan88, möchten Sie nur eine Spalte am Ende haben? – MaxU

Verwandte Themen