HOWTO · Python
Como subtrair datas e horas em Python
Saiba como subtrair objetos datetime em Python e converter a duração resultante.
Nesta página
Subtraia um objeto datetime de outro com mais_recente - mais_antigo. O Python devolve um timedelta, que representa o tempo decorrido entre os dois valores. Pode consultar essa duração em dias e segundos ou convertê-la em segundos, minutos ou horas no total.
Utilizar o módulo datetime para subtrair datas e horas em Python
O módulo datetime fornece objetos para datas e horas. Crie cada valor indicando ano, mês e dia; horas, minutos, segundos e microssegundos são opcionais. O exemplo abaixo usa valores fixos, por isso o resultado não depende do momento em que o executar.
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
O resultado é um timedelta de duas horas e trinta minutos. Os atributos days, seconds e microseconds descrevem a duração em componentes normalizados. Para obter o total de segundos decorridos, chame total_seconds() no timedelta (e não num datetime). Divida esse valor por 60 para obter minutos ou por 3.600 para obter horas. Estas divisões mantêm as frações quando a duração não corresponde a um número inteiro de minutos ou horas.
O atributo days representa a componente de dias completos, enquanto seconds contém os segundos restantes na duração normalizada; nenhum deles substitui o total de segundos. Por exemplo, uma duração superior a um dia pode ter seconds inferior a 86 400. Use total_seconds() quando precisar de contar os segundos de todo o intervalo. O valor devolvido pode ser um número decimal se a duração incluir microssegundos.
Se precisar de unidades inteiras, escolha explicitamente uma regra de arredondamento. A conversão com int() trunca em direção a zero; não arredonda para a unidade mais próxima. Além disso, um ano não tem uma duração fixa: considerar 365 dias como um ano é apenas uma aproximação, porque os anos bissextos e as mudanças de mês afetam os cálculos baseados no calendário. Quando a questão envolver datas como «um ano depois», use uma interpretação baseada no calendário, em vez de segundos decorridos.
A subtração é adequada quando ambos os valores podem ser comparados de forma consistente. Valores sem fuso horário podem ser subtraídos de outros valores sem fuso horário. Para valores com fuso horário, normalize ambos para UTC com astimezone(timezone.utc) quando precisar do tempo decorrido através de transições de fuso horário. Misturar um valor sem fuso horário com outro que tenha fuso horário gera TypeError; atribua ou converta as informações de fuso horário deliberadamente antes de fazer a subtração.