Módulo 14 - Datas e expressões regulares
Cálculos com datas
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Entender o que é uma duração e como o timedelta a representa.
- Somar e subtrair dias de uma data com segurança.
- Calcular a diferença entre duas datas e ler o resultado em dias.
- Descobrir a idade de alguém em dias a partir da data de nascimento.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Cálculos com datas.
Os objetivos desta aula. Entender o que é uma duração e como o timedelta a representa. Somar e subtrair dias de uma data com segurança. Calcular a diferença entre duas datas e ler o resultado em dias. Descobrir a idade de alguém em dias a partir da data de nascimento.
Veja o essencial, parte por parte.
Duração é um tipo à parte. Um timedelta representa uma duração, como timedelta(days=30).
Quantos dias entre duas datas. Se quer sempre um número positivo, use abs((data_a - data_b).days).
Calculando a idade em dias. Um exemplo clássico junta tudo: calcular há quantos dias uma pessoa nasceu.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Duração é um tipo à parte
Existe uma diferença sutil, mas importante, entre uma data e uma duração. Uma data é um ponto no tempo: 2 de julho de 2026. Uma duração é um intervalo: 30 dias, sem começo nem fim definidos. O Python separa esses conceitos em tipos diferentes. A data é date ou datetime; a duração é timedelta. Você cria um timedelta dizendo quanto tempo ele representa, por exemplo timedelta(days=30) para trinta dias, e então soma ou subtrai esse intervalo de uma data.
from datetime import date, timedelta
hoje = date(2026, 7, 2)
uma_semana = timedelta(days=7)
futuro = hoje + uma_semana
passado = hoje - uma_semana
print(futuro) # 2026-07-09 (7 dias depois)
print(passado) # 2026-06-25 (7 dias antes)
# O Python cuida da virada de mes sozinho:
fim_do_mes = date(2026, 7, 31) + timedelta(days=1)
print(fim_do_mes) # 2026-08-01Somar ou subtrair um timedelta de uma data devolve outra data. A virada de mês é automática.
Repare no último exemplo: somar um dia a 31 de julho leva para 1 de agosto, sem que você precise saber que julho tem 31 dias. Esse é o grande ganho. O timedelta e o tipo de data cuidam de todas as regras chatas do calendário, incluindo meses de 28, 30 e 31 dias e até anos bissextos. Você pensa em dias; o Python pensa no resto. Além de days, o timedelta aceita weeks, hours, minutes e seconds, então dá para expressar quase qualquer intervalo.
Quantos dias entre duas datas
A operação mais útil talvez seja a inversa: você tem duas datas e quer saber quanto tempo há entre elas. Basta subtrair uma da outra. O resultado não é um número solto, e sim um timedelta, aquele tipo de duração. Para ler o total em dias, use o atributo .days do resultado. Se a primeira data for mais tarde que a segunda, o número de dias vem positivo; se for mais cedo, vem negativo. Isso é ótimo para calcular prazos, contagens regressivas e tempo decorrido.
from datetime import date
hoje = date(2026, 7, 2)
natal = date(2026, 12, 25)
faltam = natal - hoje # isto e um timedelta
print(faltam) # 176 days, 0:00:00
print(faltam.days) # 176 (numero inteiro de dias)
print(f"Faltam {faltam.days} dias para o Natal.")
# Faltam 176 dias para o Natal.
# Ordem invertida da diferenca negativa:
print((hoje - natal).days) # -176Subtrair duas datas devolve um timedelta; .days extrai o total de dias como inteiro.
Calculando a idade em dias
Um exemplo clássico junta tudo: calcular há quantos dias uma pessoa nasceu. Você tem a data de nascimento e a data de hoje; a idade em dias é simplesmente a diferença entre as duas, lida com .days. Como today() dá a data atual, o cálculo se atualiza sozinho a cada dia que passa. Vale lembrar que idade em anos é mais delicada, porque depende de a pessoa já ter feito aniversário no ano corrente, mas idade em dias é direta e exata.
from datetime import date
nascimento = date(2000, 3, 15)
hoje = date(2026, 7, 2)
idade = hoje - nascimento
print(idade.days) # 9606 (dias vividos ate 02/07/2026)
# Idade aproximada em anos (divisao inteira por 365):
anos = idade.days // 365
print(f"Cerca de {anos} anos de vida.") # Cerca de 26 anos de vida.
# Proximo aniversario neste ano:
aniversario = date(hoje.year, nascimento.month, nascimento.day)
print(aniversario) # 2026-03-15Idade em dias é a diferença direta; dividir por 365 dá uma estimativa de anos.
A divisão inteira dos dias por 365 dá uma estimativa boa de anos, mas repare que é aproximada: ela ignora os anos bissextos, que têm 366 dias. Para a maioria dos usos do dia a dia, essa aproximação basta. Se você precisar da idade exata em anos, o caminho é comparar o mês e o dia de hoje com o mês e o dia do nascimento, subtraindo um ano quando a pessoa ainda não fez aniversário. Fica como um bom desafio para depois, mas o essencial desta aula é claro: com timedelta, contas de calendário deixam de ser um pesadelo.
Teste rápido
Você subtraiu duas datas e guardou em dif. Como pega o número inteiro de dias entre elas?
Perguntas frequentes
- Por que a subtração de duas datas não dá logo um número?
- Porque o resultado é uma duração, e o Python representa duração com o tipo timedelta, que carrega dias, segundos e microssegundos. Isso é mais rico que um número solto. Para o total de dias, leia o atributo .days do timedelta.
- Posso somar meses com timedelta, tipo timedelta(months=1)?
- Não. O timedelta aceita days, weeks, hours, minutes e seconds, mas não months nem years, porque mês e ano têm tamanhos variáveis. Para somar meses de forma exata, usa-se uma biblioteca externa (dateutil) ou manipula-se ano e mês na mão; para dias, o timedelta resolve.
- Como garantir que a contagem de dias seja sempre positiva?
- Use a função abs sobre o número de dias: abs((data_a - data_b).days). abs devolve o valor sem sinal, então não importa qual data você coloca primeiro. É o jeito seguro de mostrar uma contagem regressiva sem surpresas negativas.
- Dá para somar horas e minutos, não só dias?
- Dá. O timedelta aceita várias unidades ao mesmo tempo, como timedelta(days=1, hours=6). Some isso a um datetime (que tem hora) para avançar dia e hora juntos. Somar horas a um date puro não faz sentido, porque date não guarda hora.
- Por que dividir os dias por 365 dá idade aproximada e não exata?
- Porque nem todo ano tem 365 dias: os anos bissextos têm 366. Ao dividir por 365 fixo, você ignora esses dias a mais, então o resultado pode errar por pouco em intervalos longos. Para o dia a dia, a aproximação serve; a idade exata pede comparar mês e dia.
- O cálculo com today() se atualiza sozinho?
- Sim. Como date.today() lê a data atual do computador toda vez que roda, um cálculo como hoje - nascimento devolve um número maior a cada dia que passa, sem você mexer no código. É por isso que today() é ideal para contagens que dependem do dia de hoje.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.