Posiblemente una de las mejores opciones para trabajar con fechas en Python sea el tipo de dato datetime64
de NumPy. El cual permite realizar operaciones con fechas como con números, pudiendo restar, sumar o dividir con días, semanas, meses o años. Veamos las opciones que ofrece datetime64
para calcular la diferencia entre dos fechas en Python.
Creación de series con fechas
En Pandas existe el método date_range()
con el que se puede crear una serie de fechas separadas con un período dado. La forma básica de esta función es la siguiente
pd.date_range(start, periods, freq)
Donde
start
: es la fecha en la que comienza la serieperiods
: es el número elementos que se desea para la seriefreq
: es la separación entre cada uno de los elementos'D'
: dias'W'
: semanas'M'
: meses'Y'
: años
Por ejemplo, para crear un DataFrame con una serie separada por días, semanas, meses y años se puede usar el siguiente código.
import numpy as np import pandas as pd df = pd.DataFrame({'days': pd.date_range(start='9/1/2022', periods=6, freq='D'), 'weeks': pd.date_range(start='9/2/2022', periods=6, freq='W'), 'months': pd.date_range(start='9/3/2020', periods=6, freq='M'), 'years': pd.date_range(start='9/3/2020', periods=6, freq='Y')}) print(df) print(df.dtypes)
days weeks months years 0 2022-09-01 2022-09-04 2020-09-30 2020-12-31 1 2022-09-02 2022-09-11 2020-10-31 2021-12-31 2 2022-09-03 2022-09-18 2020-11-30 2022-12-31 3 2022-09-04 2022-09-25 2020-12-31 2023-12-31 4 2022-09-05 2022-10-02 2021-01-31 2024-12-31 5 2022-09-06 2022-10-09 2021-02-28 2025-12-31 days datetime64[ns] weeks datetime64[ns] months datetime64[ns] years datetime64[ns] dtype: object
Nótese que, cuando la frecuencia no es diaria, la serie no comienza en la fecha indicada, sino que lo hace en el último día de la semana, mes o año a la que corresponde la fecha. Por otro lado, se puede comprobar que el tipo de dato de cada una de las series del DataFrame es datetime64
.
Obtener la diferencia entre dos fechas en Python
En ese punto, una vez creado un DataFrame con varias series tipo fecha, se puede ver como calcular la diferencia entre dos fechas. Por ejemplo, entre las series days
y weeks
df.days - df.weeks
0 -3 days 1 -9 days 2 -15 days 3 -21 days 4 -27 days 5 -33 days dtype: timedelta64[ns]
El resultado que se ve por pantalla es el esperado, la diferencia entre las fechas. En este caso el resultado aparece en un tipo de dato nuevo timedelta64
donde se puede almacenar diferencias entre dos fechas. Si se desea obtener la diferencia en meses u otra unidad de tiempo, simplemente se debe dividir el resultado entre un dato de tipo timedelta64
adecuado. Lo que se puede conseguir con la función np.timedelta64()
. Así, para obtener el resultado en días se puede hacer
(df.days - df.weeks) / np.timedelta64(1, 'D')
0 -3.0 1 -9.0 2 -15.0 3 -21.0 4 -27.0 5 -33.0 dtype: float64
En donde el resultado es una serie con datos de tipo real (float64
). O para obtener la diferencia en meses simplemente se debe cambiar la frecuencia por 'M'
.
(df.days - df.weeks) / np.timedelta64(1, 'M')
0 -0.098565 1 -0.295694 2 -0.492823 3 -0.689953 4 -0.887082 5 -1.084211 dtype: float64
Consiguiendo el resultado en una serie de tipo float64
.
Incluir la diferencia entre dos fechas en un DataFrame
Lo visto hasta ahora se puede usar para incluir en un DataFrame la diferencia entre dos fechas en diferentes unidades. Algo que se muestra en el siguiente ejemplo.
df = pd.DataFrame({'start': pd.date_range(start='1/1/2022', periods=6, freq='W'), 'end': pd.date_range(start='9/1/2022', periods=6, freq='M')}) df['diff_days'] = (df['end'] - df['start']) / np.timedelta64(1, 'D') df['diff_weeks'] = (df['end'] - df['start']) / np.timedelta64(1, 'W') df['diff_months'] = (df['end'] - df['start']) / np.timedelta64(1, 'M') df['diff_years'] = (df['end'] - df['start']) / np.timedelta64(1, 'Y') print(df)
start end diff_days diff_weeks diff_months diff_years 0 2022-01-02 2022-09-30 271.0 38.714286 8.903674 0.741973 1 2022-01-09 2022-10-31 295.0 42.142857 9.692191 0.807683 2 2022-01-16 2022-11-30 318.0 45.428571 10.447853 0.870654 3 2022-01-23 2022-12-31 342.0 48.857143 11.236370 0.936364 4 2022-01-30 2023-01-31 366.0 52.285714 12.024888 1.002074 5 2022-02-06 2023-02-28 387.0 55.285714 12.714840 1.059570
Conclusiones
En esta entrada se ha visto el uso de los tipos de dato datetime64
y timedelta64
de NumPy para calcular la diferencia entre dos fechas en Python. Una operación que se puede realizar de una manera sencilla gracias a este tipo de dato.
Imagen de Michal Jarmoluk en Pixabay
Sebastian Guandique dice
Este tipo de datos ayuda bastante a poder simplificar trabajos que necesitaban de mayor tiempo