Saltar al contenido

Convierta una columna de fecha y hora en época en Python

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *