J'ai actuellement un problème avec Python. J'ai un Pandas DataFrame et une des colonnes est une chaîne avec une date. Le format est:
"% Y-% m-% d% H:% m: 00.000". Par exemple: "2011-04-24 01: 30: 00.000"
J'ai besoin de convertir la colonne entière en entiers. J'ai essayé d'exécuter ce code, mais il est extrêmement lent et j'ai quelques millions de lignes.
for i in range(calls.shape[0]):
calls['dateint'][i] = int(time.mktime(time.strptime(calls.DATE[i], "%Y-%m-%d %H:%M:00.000")))
Savez-vous comment convertir toute la colonne en temps Epoch?
Merci d'avance !
convertir la chaîne en datetime
en utilisant to_datetime
puis soustraire datetime 1970-1-1 et appeler dt.total_seconds()
:
In [2]:
import pandas as pd
import datetime as dt
df = pd.DataFrame({'date':['2011-04-24 01:30:00.000']})
df
Out[2]:
date
0 2011-04-24 01:30:00.000
In [3]:
df['date'] = pd.to_datetime(df['date'])
df
Out[3]:
date
0 2011-04-24 01:30:00
In [6]:
(df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
Out[6]:
0 1303608600
Name: date, dtype: float64
Vous pouvez voir que la conversion de cette valeur revient en même temps:
In [8]:
pd.to_datetime(1303608600, unit='s')
Out[8]:
Timestamp('2011-04-24 01:30:00')
Vous pouvez donc soit ajouter une nouvelle colonne ou écraser:
In [9]:
df['Epoch'] = (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
df
Out[9]:
date Epoch
0 2011-04-24 01:30:00 1303608600
MODIFIER
meilleure méthode comme suggéré par @Jeff:
In [3]:
df['date'].astype('int64')//1e9
Out[3]:
0 1303608600
Name: date, dtype: float64
In [4]:
%timeit (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
%timeit df['date'].astype('int64')//1e9
100 loops, best of 3: 1.72 ms per loop
1000 loops, best of 3: 275 µs per loop
Vous pouvez également voir que c'est beaucoup plus rapide
De la documentation Pandas sur l'utilisation des données de séries chronologiques:
On soustrait l'Epoch (minuit au 1er janvier 1970 UTC) puis on divise le plancher par "l'unité" (1 ms).
stamps = pd.date_range('2012-10-08 18:15:05', periods=4, freq='D')
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms')
Cela donnera le temps Epoch en millisecondes.