web-dev-qa-db-fra.com

Convertir une colonne d'heures en Epoch en Python

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 !

15
marcsarfa

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

17
EdChum

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.

2
ares