Solución:
Las diferencias de marca de tiempo de Pandas devuelven un objeto datetime.timedelta. Esto se puede convertir fácilmente en horas usando el método * as_type *, así
import pandas
df = pandas.DataFrame(columns=['to','fr','ans'])
df.to = [pandas.Timestamp('2014-01-24 13:03:12.050000'), pandas.Timestamp('2014-01-27 11:57:18.240000'), pandas.Timestamp('2014-01-23 10:07:47.660000')]
df.fr = [pandas.Timestamp('2014-01-26 23:41:21.870000'), pandas.Timestamp('2014-01-27 15:38:22.540000'), pandas.Timestamp('2014-01-23 18:50:41.420000')]
(df.fr-df.to).astype('timedelta64[h]')
ceder,
0 58
1 3
2 8
dtype: float64
Esto me estaba volviendo loco como el .astype()
La solución anterior no funcionó para mí. Pero encontré otra forma. No lo he cronometrado ni nada, pero podría funcionar para otros:
t1 = pd.to_datetime('1/1/2015 01:00')
t2 = pd.to_datetime('1/1/2015 03:30')
print pd.Timedelta(t2 - t1).seconds / 3600.0
… si quieres horas. O:
print pd.Timedelta(t2 - t1).seconds / 60.0
… si quieres minutos.
-
¿Cómo convierto mis resultados a solo horas y minutos?
- La respuesta aceptada solo regresa
days + hours
. Los minutos no están incluidos.
- La respuesta aceptada solo regresa
- Para proporcionar una columna que tenga horas y minutos, como
hh:mm
ox hours y minutes
, requeriría cálculos adicionales y formato de cadena. - Esta respuesta muestra cómo obtener horas totales o minutos totales como flotante, usando
timedelta
matemáticas, y es más rápido que usar.astype('timedelta64[h]')
- Guía del usuario de Pandas Time Deltas
- Guía del usuario de funciones de fecha / serie temporal de Pandas
- pitón
timedelta
objetos: consulte las operaciones admitidas. - Los siguientes datos de muestra ya son un
datetime64[ns] dtype
. Se requiere que todas las columnas relevantes se conviertan usandopandas.to_datetime()
.
import pandas as pd
# test data from OP, with values already in a datetime format
data = {'to_date': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000'), pd.Timestamp('2014-01-23 10:07:47.660000')],
'from_date': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000'), pd.Timestamp('2014-01-23 18:50:41.420000')]}
# test dataframe; the columns must be in a datetime format; use pandas.to_datetime if needed
df = pd.DataFrame(data)
# add a timedelta column if wanted. It's added here for information only
# df['time_delta_with_sub'] = df.from_date.sub(df.to_date) # also works
df['time_delta'] = (df.from_date - df.to_date)
# create a column with timedelta as total hours, as a float type
df['tot_hour_diff'] = (df.from_date - df.to_date) / pd.Timedelta(hours=1)
# create a colume with timedelta as total minutes, as a float type
df['tot_mins_diff'] = (df.from_date - df.to_date) / pd.Timedelta(minutes=1)
# display(df)
to_date from_date time_delta tot_hour_diff tot_mins_diff
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.870 2 days 10:38:09.820000 58.636061 3518.163667
1 2014-01-27 11:57:18.240 2014-01-27 15:38:22.540 0 days 03:41:04.300000 3.684528 221.071667
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.420 0 days 08:42:53.760000 8.714933 522.896000
Otros metodos
- Una nota del podcast en Otros recursos,
.total_seconds()
se agregó y fusionó cuando el desarrollador principal estaba de vacaciones y no se habría aprobado.- Ésta es también la razón por la que no hay otras
.total_xx
métodos.
- Ésta es también la razón por la que no hay otras
# convert the entire timedelta to seconds
# this is the same as td / timedelta(seconds=1)
(df.from_date - df.to_date).dt.total_seconds()
[out]:
0 211089.82
1 13264.30
2 31373.76
dtype: float64
# get the number of days
(df.from_date - df.to_date).dt.days
[out]:
0 2
1 0
2 0
dtype: int64
# get the seconds for hours + minutes + seconds, but not days
# note the difference from total_seconds
(df.from_date - df.to_date).dt.seconds
[out]:
0 38289
1 13264
2 31373
dtype: int64
Otros recursos
- Háblame de Python: Episodio n. ° 271: ¡Desbloquea los misterios del tiempo, la fecha y hora de Python!
- Timedelta comienza a los 31 minutos
- Según el desarrollador principal de Python Paul Ganssle y Python
dateutil
mantenedor:- Usar
(df.from_date - df.to_date) / pd.Timedelta(hours=1)
- No use
(df.from_date - df.to_date).dt.total_seconds() / 3600
pandas.Series.dt.total_seconds
-
.dt
accesor
- Usar
- Real Python: uso de Python datetime para trabajar con fechas y horas
- los
dateutil
El módulo proporciona potentes extensiones al estándardatetime
módulo.
%%timeit
prueba
import pandas as pd
# dataframe with 2M rows
data = {'to_date': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000')], 'from_date': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000')]}
df = pd.DataFrame(data)
df = pd.concat([df] * 1000000).reset_index(drop=True)
%%timeit
(df.from_date - df.to_date) / pd.Timedelta(hours=1)
[out]:
43.1 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
(df.from_date - df.to_date).astype('timedelta64[h]')
[out]:
59.8 ms ± 1.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)