2016-01-19 9 views
19

Potrzebuję przetworzyć ogromną ilość plików CSV, w których znacznik czasu jest zawsze ciągiem reprezentującym znacznik czasu unix w milisekundach. Nie udało mi się znaleźć jeszcze skutecznej metody modyfikacji kolumn.Pandy konwertujące wiersz z uniksowym znacznikiem czasu (w milisekundach) na datetime

Oto, co wymyśliłem, ale to oczywiście powiela tylko kolumnę i muszę jakoś umieścić ją z powrotem w oryginalnym zbiorze danych. Jestem pewien, że można to zrobić podczas tworzenia 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) 

Pozwoli to wybrać kolumnę 'unixtime' i zmienić go z

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

w tym

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] 

Jednakże chciałbym użyć czegoś jak pd.apply() aby cały zestaw danych zwrócony z konwersją kolumna lub jak już napisałem, po prostu tworzenie datetimes podczas generowania DataFrame z pliku CSV.

Odpowiedz

20

Można to zrobić jako etapu przetwarzania Post używając to_datetime i przechodzącej argumentu 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

Ach, całkowicie brakowało że 'unit' parametr, dzięki, że to miły jeden! Zrobię żądanie ściągnięcia, aby uwzględnić to również w '.read_csv' za pośrednictwem parse_dates. – tamasgal

+0

Może to prowadzić do niewłaściwego czasu z powodu problemów z strefą czasową. –

+0

@PengjuZhao pytanie OP nie wspomina o strefie czasowej, ponieważ ta odpowiedź Teudimundo rozwiązuje to: – EdChum

2

wymyśliłem rozwiązanie ja zgadnę:

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

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

ja nadal nie jestem pewien, czy to jest najlepszy chociaż.

4

używam rozwiązanie @EdChum, ale dodam zarządzanie Strefa czasowa:

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

tz_localize wskazuje, że znacznik czasu powinien być traktowany jako oznaczający "UTC", wówczas tz_convert faktycznie przenosi datę/czas do właściwej strefy czasowej (w tym przypadku "America/New_York").

Należy pamiętać, że został przekonwertowany na DatetimeIndex, ponieważ metody tz_ działają tylko na indeksie serii. Od Pand 0.15 można używać .dt:

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