2016-01-19 20 views
19

Ich muss eine große Menge von CSV-Dateien verarbeiten, wobei der Zeitstempel immer eine Zeichenfolge ist, die den Unix-Zeitstempel in Millisekunden darstellt. Ich konnte noch keine Methode finden, um diese Spalten effizient zu modifizieren.Pandas konvertieren Zeile mit Unix-Zeitstempel (in Millisekunden) bis Datetime

Das ist, was ich gefunden habe, aber das dupliziert natürlich nur die Spalte und ich muss es irgendwie zum ursprünglichen Datensatz zurückstellen. Ich bin mir sicher, dass es bei der Erstellung der DataFrame getan werden kann?

import sys 
if sys.version_info[0] < 3: 
    from StringIO import StringIO 
else: 
    from io import StringIO 
import pandas as pd 

data = 'RUN,UNIXTIME,VALUE\n1,1447160702320,10\n2,1447160702364,20\n3,1447160722364,42' 

df = pd.read_csv(StringIO(data)) 

convert = lambda x: datetime.datetime.fromtimestamp(x/1e3) 
converted_df = df['UNIXTIME'].apply(convert) 

Dies wird die Spalte ‚Unix-Zeit‘ wählen und ändern von

0 1447160702320 
1 1447160702364 
2 1447160722364 
Name: UNIXTIME, dtype: int64 

in diesem

0 2015-11-10 14:05:02.320 
1 2015-11-10 14:05:02.364 
2 2015-11-10 14:05:22.364 
Name: UNIXTIME, dtype: datetime64[ns] 

Allerdings würde Ich mag so etwas wie pd.apply() verwenden, um den gesamten Datensatz zu erhalten zurückgegeben mit der konvertierten Spalte oder wie ich bereits schrieb, erstellen Sie einfach Datumswerte beim Generieren des DataFrame von CSV.

Antwort

20

Sie können als Postverarbeitungsschritt tun dies mit to_datetime und vorbei arg unit='ms':

In [5]: 
df['UNIXTIME'] = pd.to_datetime(df['UNIXTIME'], unit='ms') 
df 

Out[5]: 
    RUN    UNIXTIME VALUE 
0 1 2015-11-10 13:05:02.320  10 
1 2 2015-11-10 13:05:02.364  20 
2 3 2015-11-10 13:05:22.364  42 
+0

Ah, ich völlig verfehlt, dass 'unit' Parameter, danke, das ist ein nice one! Ich werde eine Pull-Anfrage machen, um das auch in '.read_csv' über parse_dates einzubinden. – tamasgal

+0

Dies kann aufgrund von Zeitzonenproblemen zu einer falschen Uhrzeit führen. –

+0

@PengjuZhao die OP-Frage erwähnt keine Zeitzone, für die Teudimundo Antwort löst das – EdChum

2

Ich kam mit einer Lösung bis ich denke:

convert = lambda x: datetime.datetime.fromtimestamp(float(x)/1e3) 

df = pd.read_csv(StringIO(data), parse_dates=['UNIXTIME'], date_parser=convert) 

Ich bin immer noch nicht sicher, ob dies die beste ist jedoch.

4

ich die @EdChum Lösung verwenden, aber ich hinzufügen, die Zeitzone Management:

df['UNIXTIME']=pd.DatetimeIndex(pd.to_datetime(pd['UNIXTIME'], unit='ms'))\ 
       .tz_localize('UTC')\ 
       .tz_convert('America/New_York') 

die tz_localize Gibt an, dass der Zeitstempel in Bezug auf 'UTC' berücksichtigt werden sollte, dann verschiebt die tz_convert das Datum/die Uhrzeit tatsächlich in die richtige Zeitzone (in diesem Fall 'America/New_York').

Beachten Sie, dass es in eine DatetimeIndex konvertiert wurde, da die tz_ Methoden nur auf den Index der Serie funktioniert. Da Pandas 0,15 kann man .dt verwenden:

df['UNIXTIME']=pd.to_datetime(pd['UNIXTIME'], unit='ms')\ 
       .dt.tz_localize('UTC')\ 
       .dt.tz_convert('America/New_York') 
Verwandte Themen