HOWTO · Python

Cómo restar objetos datetime en Python

Aprende a restar objetos datetime en Python y convertir la duración resultante a segundos, minutos u horas.

En esta página

Resta un objeto datetime de otro con posterior - anterior. Python devuelve un timedelta que representa el tiempo transcurrido entre ambos valores. Puedes consultar esa duración en días y segundos, o convertirla a segundos, minutos u horas totales.

Restar objetos datetime en Python con el módulo datetime

El módulo datetime proporciona objetos para representar fechas y horas. Para crear cada valor, indica el año, el mes y el día; las horas, los minutos, los segundos y los microsegundos son opcionales. El ejemplo usa valores fijos, así que el resultado no depende de cuándo lo ejecutes.

from datetime import datetime

earlier = datetime(2024, 5, 1, 9, 0)
later = datetime(2024, 5, 1, 11, 30)
duration = later - earlier

print(duration)
print(duration.total_seconds())
print(duration.total_seconds() / 60)
print(duration.total_seconds() / 3600)
2:30:00
9000.0
150.0
2.5

El resultado es un timedelta de dos horas y treinta minutos. Sus atributos days, seconds y microseconds representan la duración mediante componentes normalizados. Para obtener el total de segundos transcurridos, llama a total_seconds() en el timedelta, no en un objeto datetime. Divide ese valor entre 60 para calcular los minutos o entre 3600 para calcular las horas. Si la duración no equivale a un número entero de minutos u horas, las divisiones conservan la parte fraccionaria.

El atributo days indica los días completos y seconds contiene los segundos restantes de la duración normalizada. Ninguno de los dos equivale por sí solo al total de segundos. Por ejemplo, una duración superior a un día puede tener menos de 86 400 en seconds; usa total_seconds() si necesitas contar los segundos de todo el intervalo. Si la duración incluye microsegundos, el valor devuelto puede ser un número de punto flotante.

Si necesitas unidades enteras, decide explícitamente cómo redondear. Convertir con int() trunca hacia cero; no redondea al entero más cercano. Además, un año no tiene una duración fija: tomar 365 días como un año es solo una aproximación, pues los años bisiestos y los límites entre meses afectan los cálculos del calendario. Si quieres responder a una pregunta sobre fechas, como «un año después», usa una interpretación basada en el calendario en lugar de convertir la duración a segundos.

La resta funciona cuando ambos valores se pueden comparar de forma coherente. Puedes restar entre sí valores naive, es decir, sin información de zona horaria. Para calcular el tiempo transcurrido entre valores que sí tienen zona horaria, normalízalos a UTC con astimezone(timezone.utc), especialmente si el intervalo cruza un cambio de zona horaria. Si mezclas un valor naive con uno que incluye zona horaria, Python genera un TypeError. Antes de restarlos, asigna o convierte la información de zona horaria de forma deliberada.