2016-01-19 12 views
19

Ho bisogno di elaborare una quantità enorme di file CSV in cui il timestamp è sempre una stringa che rappresenta il timestamp di unix in millisecondi. Non sono riuscito a trovare un metodo per modificare queste colonne in modo efficiente.Panda che converte una riga con timestamp unix (in millisecondi) a datetime

Questo è quello che è venuto fuori, tuttavia questo naturalmente duplica solo la colonna e devo in qualche modo rimetterlo sul set di dati originale. Sono sicuro che si può fare quando si crea il DataFrame?

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) 

Questa sceglierà la colonna 'unixtime' e modificarlo da

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

in questo

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] 

Tuttavia, vorrei usare qualcosa come pd.apply() per ottenere l'intera serie di dati restituito con la colonna convertita o, come ho già scritto, crea semplicemente dati datati durante la generazione di DataFrame da CSV.

risposta

20

Si può fare questo come una fase di lavorazione post utilizzando to_datetime e passando 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, ho completamente perso che 'parametro unit', grazie, questa è una bella! Farò una richiesta pull per includerla anche in '.read_csv' tramite parse_dates. – tamasgal

+0

Ciò potrebbe comportare il momento sbagliato a causa del problema del fuso orario. –

+0

@PengjuZhao la domanda dell'OP non fa menzione del fuso orario, perché la risposta di Teudimundo risolve il fatto che – EdChum

2

mi si avvicinò con una soluzione immagino:

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

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

Non sono ancora sicuro se questo è il migliore però.

4

Io uso la soluzione @EdChum, ma aggiungere la gestione fuso orario:

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

il tz_localize indica che il timestamp deve essere considerato come relativo a 'UTC', quindi lo tz_convert sposta effettivamente la data/ora sul fuso orario corretto (in questo caso `America/New_York ').

Si noti che è stato convertito in DatetimeIndex perché i metodi tz_ funzionano solo sull'indice della serie. Dal momento che Pandas 0.15 si può usare .dt:

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