Solución:
convertir la cadena en un datetime
utilizando to_datetime
y luego restar fecha y hora 1970-1-1 y llamar 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
Puede ver que volver a convertir este valor produce el mismo tiempo:
In [8]:
pd.to_datetime(1303608600, unit="s")
Out[8]:
Timestamp('2011-04-24 01:30:00')
Entonces puede agregar una nueva columna o sobrescribir:
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
EDITAR
mejor método sugerido por @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
También puede ver que es significativamente más rápido.
De la documentación de Pandas sobre cómo trabajar con datos de series de tiempo:
Restamos la época (medianoche del 1 de enero de 1970 UTC) y luego dividimos el piso por la “unidad” (1 ms).
# generate some timestamps
stamps = pd.date_range('2012-10-08 18:15:05', periods=4, freq='D')
# convert it to milliseconds from epoch
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1ms')
Esto le dará el tiempo de época en milisegundos.
Sé que esto es antiguo, pero creo que la forma más limpia es la siguiente:
calls['DATE'].apply(lambda x: x.timestamp())
Esto asume calls['DATE']
es un datetime64[ns]
escribe. Si no es así, conviértalo con:
pd.to_datetime(calls['DATE'], format="%Y-%m-%d %H:%m:00.000")
Explicación
Para obtener el valor de época (en segundos) de un pd.Timestamp
, usar:
pd.Timestamp('20200101').timestamp()
Esto debería darte 1577836800.0
. Puedes enviar a un int
si tu quieres. La razón por la que es flotante es porque cualquier tiempo de subsegundos estará en la parte decimal.
Para completar, también puede obtener el valor de época sin procesar (en nanosegundos) usando esto:
pd.Timestamp('20200101').value
Da 1577836800000000000 que es la época de la fecha anterior. los .value
El atributo es el número de nanosegundos desde época, por lo que dividimos entre 1e6 para llegar a milisegundos. Divida por 1e9 si desea que la época en segundos sea la primera llamada.