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.

23
demandé sur tamasgal 2016-01-19 20:20:34

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
25
répondu EdChum 2016-01-19 18:01:58

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')
5
répondu Teudimundo 2017-02-20 09:31:21

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.

2
répondu tamasgal 2016-01-19 17:26:59