Saltar al contenido

Calcular la diferencia de tiempo de Pandas DataFrame entre dos columnas en horas y minutos

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.
  • Para proporcionar una columna que tenga horas y minutos, como hh:mm o x 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 usando pandas.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.
# 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
  • Real Python: uso de Python datetime para trabajar con fechas y horas
  • los dateutil El módulo proporciona potentes extensiones al estándar datetime 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)



Utiliza Nuestro Buscador

Deja una respuesta

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