Trabalhando com datas e horas em Python – datetime

Módulos utilizados nesse post:

  • date
  • datetime
  • timedelta

Esse post vai mostrar alguns exemplos simples de como utilizar o módulo datetime [1] para manipularmos, em Python, dados que representam datas. Antes de qualquer coisa, vou enumerar algumas operações que são corriqueiras quando precisamos lidar com datas:

  1. Obter a data atual;
  2. Obter a data antes ou após X dias da data atual;
  3. Calcular a diferença de dias entre duas datas;
  4. Descobrir o dia da semana em que determinada data cai;

Agora vamos ver como resolvê-las, usando o módulo datetime.

1. Obter a data atual

O módulo datetime possui dentro de si uma classe date [2] definida. Nessa classe, existem alguns métodos para manipulação de datas, como a função today, que retorna um objeto do tipo datetime.date.

>>> from datetime import date
>>> hj = date.today()
>>> print hj
2012-07-10
>>> print hj.day
10
>>> print hj.month
07
>>> print hj.year
2012

2. Obter a data há ou daqui a X dias

Para isso, iremos converter primeiramente a nossa data em um número ordinal, através do método toordinal(), que nos retorna a quantidade de dias passados desde o dia 1/1/1 até a data recebida como argumento. Depois disso, basta somar (ou subtrair) a esse número inteiro o número de dias da diferença que queremos calcular e então reconverter o inteiro para data, através do método fromordinal(). Abaixo, obtivemos a data a daqui exatos 45 dias.

>>> from datetime import date
>>> hj = date.today()
>>> print hj.toordinal()
734694
>>> futuro = date.fromordinal(hj.toordinal()+45) # hoje + 45 dias
>>> print futuro
2012-08-24

3. Calcular a diferença de dias entre datas

Para realizar essa, vamos obter as duas datas entre as quais queremos saber o intervalo de dias e depois usar o operador de subtração (-) para fazer a operação. O operador subtração, quando aplicado a datas, retorna um objeto do tipo timedelta, contendo a diferença entre as datas. Esse objeto possui um atributo chamado days, que obviamente nos dá o número de dias representados pelo delta.

>>> from datetime import date
>>> hj = date.today()
>>> print hj.toordinal()
734694
>>> futuro = date.fromordinal(hj.toordinal()+45) # hoje + 45 dias</pre>
>>> diferenca = futuro - hj
>>> print diferenca.days
45

4. Descobrir o dia da semana de uma data

Essa é fácil. Após construir uma data, podemos chamar o método weekday() do objeto date. Ele retornará um número inteiro entre 0 (represendo segunda-feira) e 6 (representando domingo).

>>> from datetime import date
>>> hj = date.today()
>>> print hj.weekday()
1
Para que apareça o dia da semana por extenso, em português, podemos usar uma tupla para armazenar os dias da semana, de acordo  com os valores retornados pelo método weekday().
>>> from datetime import date
>>> hj = date.today()
>>> dias = ('Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado', 'Domingo')
>>> print "Hoje é", dias[hj.weekday()]
Hoje é, Terça-feira

Os módulos datetime e date fazem muito mais do que o que foi mostrado aqui. Agora, acesse a documentação dos módulos e faça você mesmo alguns testes.

[1] http://docs.python.org/library/datetime.html

[2] http://docs.python.org/library/datetime.html#datetime.date

24 comentários sobre “Trabalhando com datas e horas em Python – datetime

  1. Gostaria de saber como eu posso estár chegando se uma data inseria por um input é igual ou não a data atual? Parabens pelo blog muito explicativo…Se puderem me responder eu agradeço, pois ainda sou inicantem python.

    • Alexandre, obrigado por acompanhar o blog! Considerando que a entrada do usuário é recebida como uma string no formato ‘dd/mm/aaaa’, podemos pensar em ao menos duas formas de responder sua pergunta:

      1. Converter a data fornecida pelo usuário em um objeto do tipo datetime.date e comparar com a data de hoje (datetime.date.today()):

      from datetime import date

      data_usuario = ’24/11/2012′
      dia, mes, ano = data_usuario.split(‘/’)
      print date.today() == date(int(ano), int(mes), int(dia))

      2. Obter a representação em formato de string da data de hoje e comparar com a string fornecida pelo usuário:

      from datetime import date

      data_usuario = ’24/11/2012′
      print date.today().strftime(‘%d/%m/%Y’) == data_usuario

      Invocamos o método strftime() sobre a data de hoje. Esse método recebe o formato em que queremos que a data apareça e então retorna a data em questão como uma string, no formato desejado.

      Qualquer dúvida, envie um comentário.

      • Obrigado pelo retorno, entendi a explicação, tentei experimentar a dica em um comando while fazendo a checagem da data inserida com a data atual, na qual a data inserida não pode ser maior que a atual. Para entender, estou fazendo um script no qual pede para o usuário inserir a data do dia ou do dia anterior, mais o script não pode aceitar uma data inserida pelo usuário que seja maior que a data atual, segue abaixo o script da data que estou tentando fazer.
        data = -1
        while date.today().strftime(‘%d/%m/%Y’) < data :
        try:
        data = input('Insira a data:')

        except:
        print('Valor inválido')

        Porem quando vou execultar o script da o erro abaixo.

        while date.today().strftime('%d/%m/%Y') < data :
        TypeError: unorderable types: str() < int()

      • Alexandre, você está comparando um inteiro (data, que possui o valor -1), com uma string, que é retornada pelo strftime(), por isso está ocorrendo o erro.

        Sua intenção é deixar o usuário prosseguir somente após digitar a data de hoje?

        Se for isso, poderia fazer o seguinte:

        data = ”
        while date.today().strftime(‘%d/%m/%Y’) != data:

        Se a sua intenção for fazer uma comparação entre datas, do tipo: se uma data for maior que a outra, sugiro dar uma lida na documentação do módulo datetime. Comparar as datas sob a forma de strings somente funcionará para igualdade e desigualdade.

  2. A minha intenção é que o usuário não consiga digitar uma data maior do que a do dia atual, por exemplo hoje é 26/11/2012, no dia de hoje o usuário não poderar digitar a data de amanhã por exemplo. Mais vou dar uma verificada na documentação do datetime. Obrigado pelo retorno.

  3. Gostaria de saber como calculo a media por mês.
    Tipo 1 – ’14/11/2012′ = 210, ’13/11/2012′ = 200, ’12/11/2012′ = 100, ’09/11/2012′ = 50, ’01/11/2012′ = 30, ’31/10/2012′ = 210, ’26/10/2012′ = 320, ’25/10/2012′ = 300.
    Gostaria de saber como faço para saber a média por mês.

    Obrigado

  4. @Ricardo Junior: Converta a data recebida como string para um objeto datetime (usando a função strptime() [1], e então a converta para um objeto date. Feito isso,compare com a data de hoje, obtida através da função today() [2]. Veja:

    >>> import datetime
    >>> datetime.datetime.strptime(“28/12/2013”, “%d/%m/%Y”).date() == datetime.date.today()
    True

    [1] http://docs.python.org/2/library/time.html#time.strptime
    [2] http://docs.python.org/2/library/datetime.html#datetime.date.today

  5. Obrigado pela dica, mas não entendi como irei usar o argumento na strptime… Pode o esboço do programa?

    import datetime
    dia=int(input(‘dia’))
    mes=int(input(‘mes’))
    ano=int(input(‘ano’))
    if datetime.datetime.strptime(‘%dia/%mes/%ano’).date()==datetime.date.today():
    print ‘true’
    else:
    print ‘false’

  6. import datetime
    dia=int(input(‘dia’))
    mes=int(input(‘mes’))
    ano=int(input(‘ano’))
    if datetime.datetime.strptime(‘%dia/%mes/%ano’,’%d/%b/%y’).date()==datetime.date.today():
    print ‘true’
    else:
    print ‘false’

  7. Boa noite Stummjr, infelizmente não consegui fazer desta maneira… mesmo fazendo a correção dita por vc, deu erro de valores…Mas lendo de novo esse artigo, eu descobri uma nova maneira de fazer… segue o cod abaixo.
    import datetime
    from datetime import date
    dia=int(input(‘dia’))
    mes=int(input(‘mes’))
    ano=int(input(‘ano’))
    hj=date.today()
    if hj.day==dia and hj.month==mes and hj.year==ano:
    print ‘true’
    else:
    print ‘false’

    Muito obrigado, gostei muito da tua pagina, e sou muito grato a vc por essa ajuda.
    Te desejo todo o sucesso do mundo:
    Vlw

  8. Boa noite sutmmjr, me desculpe reviver esse topico, mas vc pode me ajudar em uma coisa?…. Tipo eu quero montar um programa que leia 10 datas, no qual vão ser digitadas pelo usuário, e ordena-las em ordem cronológica, sem usar o comando sort…. Tipo minha duvida é a seguinte, como eu irei ‘guardar’ essas 10 datas(no formato dd/mm/aaaa), botarei em uma lista,dicionario ou algo do tipo? e para ordena-las estava pensando em usar um método de ordenação, no caso o selection…. Se possível me ajude resolver essa minha primeira pergunta, estou há 3 semanas nela e não consigo faze-la de maneira alguma… muito obrigado e sucesso.

    • Olá Mts Fox, você pode guardá-las em uma lista, sem problemas.

      Você terá essas datas em strings ou em objetos datetime? Sugiro armazená-los como datetime, pois daí você pode comparar as datas usando os operadores maior, menor, maior igual, menor igual, igual e diferente. Compará-los como strings no formato ‘dd/mm/aaaa’ vai dar mais trabalho.

      Por que você não quer usar a função sort?

  9. Ah ta vlw, mas tipo como poderei armazená-las em datetime? Eu não estava querendo usar a função sort, pois tenho medo q dei algum erro na hora de ordenar e acabe botando em uma ordem ‘errada’… sei lá, mas acho q é só sisma minha.

    • Você está lendo elas como string, correto? Digamos que o usuário digite a data no formato ‘dd/mm/yyyy’ como string. Então, você poderia converter tal string para um objeto datetime usando a função strptime, mencionada nos comentários anteriores.

      Quanto ao sort, ele irá funcionar, pois os objetos do tipo datetime implementam corretamente os operadores para comparação, que são usados pelo sort para fazer a ordenação.

      De qualquer modo, faça um teste para ver se está funcionando.

  10. Muito bom o blog, gostária de uma ajuda, sou novo em python, preciso fazer a seguinte situação, tenho a data_inicial de um curso que tem 90hs sendo elas 2 horas por semana, preciso calcular qual sera a data_final do curso.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s