Pandas convertissant la ligne avec l'horodatage unix (en millisecondes) en datetime
J'ai besoin de traiter une énorme quantité de fichiers CSV où l'horodatage est toujours une chaîne représentant l'horodatage unix en millisecondes. Je n'ai pas encore trouvé de méthode pour modifier ces colonnes efficacement.
C'est ce que j'ai trouvé, mais cela ne duplique bien sûr que la colonne et je dois en quelque sorte la remettre à l'ensemble de données d'origine. Je suis sûr que cela peut être fait lors de la création du 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,VALUEn1,1447160702320,10n2,1447160702364,20n3,1447160722364,42'
df = pd.read_csv(StringIO(data))
convert = lambda x: datetime.datetime.fromtimestamp(x / 1e3)
converted_df = df['UNIXTIME'].apply(convert)
Cela va choisir la colonne 'UNIXTIME' et la changer à partir de
0 1447160702320
1 1447160702364
2 1447160722364
Name: UNIXTIME, dtype: int64
Dans ce
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]
Cependant, je voudrais utiliser quelque chose comme pd.apply()
pour obtenir l'ensemble de données retourné avec la colonne convertie ou comme je l'ai déjà écrit, créez simplement des datetimes lors de la génération du DataFrame à partir de CSV.
3 réponses
, Vous pouvez le faire en post-traitement à l'aide de l'étape to_datetime
et en passant 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
J'utilise la solution @ EdChum, mais j'ajoute la gestion du fuseau horaire:
df['UNIXTIME']=pd.DatetimeIndex(pd.to_datetime(pd['UNIXTIME'], unit='ms'))\
.tz_localize('UTC' )\
.tz_convert('America/New_York')
Le tz_localize
indique que l'horodatage doit être considéré comme concernant 'UTC' , alors le tz_convert
déplace réellement la date / heure vers le fuseau horaire correct (dans ce cas 'America / New_York').
Notez qu'il a été converti en DatetimeIndex
car les méthodes tz_
ne fonctionnent que sur l'index de la série. Depuis Pandas 0.15 on peut utiliser .dt
:
df['UNIXTIME']=pd.to_datetime(pd['UNIXTIME'], unit='ms')\
.dt.tz_localize('UTC' )\
.dt.tz_convert('America/New_York')
Je suis venu avec une solution, je suppose:
convert = lambda x: datetime.datetime.fromtimestamp(float(x) / 1e3)
df = pd.read_csv(StringIO(data), parse_dates=['UNIXTIME'], date_parser=convert)
Je ne suis toujours pas sûr si c'est le meilleur.