Convertendo strings em datetime com Python
Overview
Bem-vindos, amigos da programação! No nosso encontro anterior, desvendamos os mistérios por trás do cálculo da diferença entre datas. Hoje, vamos elevar nossa aventura ao próximo nível explorando o universo da conversão de strings para datetime no Python. Se você já se encontrou em um labirinto tentando transformar textos em datas, prepare-se para ser guiado à luz. Arregace as mangas, pois vamos mergulhar nas profundezas do método strptime e da função parse, armados com o infalível pacote python-dateutil. Vamos lá!
No último post falamos sobre como calcular a diferença (delta) entre duas datas (datetime). Neste vou falar, de forma geral, de maneiras como converter uma string em datetime no Python.
Para algumas das operações deste post, você vai precisar do pacote python-dateutil. Se precisar instalar este pacote, utilize o PIP com o comando abaixo:
pip install python-dateutil
Tanto no Linux quanto no Windows, você (certamente) precisará de privilégios de administrador/root para executar este comando. No Linux, se estiver utilizando Python 3, altere o comando de pip pra pip3. (Não tem pip3 instalado? utilize o comando apt-get install pip3 para baixá-lo!)
No seu arquivo .py, faça as seguintes importações:
from datetime import datetime
from dateutil.parser import parse
Agora vamos as conversões em si…
Utilizando o método strptime da classe datetime.
Este método recebe dois parâmetros: o primeiro é a string com a data e o segundo é o formato que esta data está.
#Defining format...
datetime_in_string = "31/12/2000 - 23:59:59"
#Setting the date in a string var...
datetime_format = "%d/%m/%Y - %H:%M:%S"
#Converting string to datetime...
result = datetime.strptime(datetime_in_string, datetime_format)
O fonte acima possui 3 operações: definição de formato da data, a data em si (em uma variável do tipo string) e o processo de conversão.
Para facilitar a leitura, a data escolhida foi 31 de Dezembro de 2000 as 23h, 59min e 59 segundos. Neste caso, o formato definindo deve ser o mesmo da sua data. Se a sua string com a data não possuir os mesmos argumentos do formato, ocorrerá um erro.
Exemplo: Se a variável datetime_in_string possuir o valor “31/12/00 – 23:59:59″ ou “31/12/200 – 23:59”, você seria agraciado com uma mensagem de erro, dizendo que a data não corresponde com o formato definido. Se no formato você definiu que o ano possuirá 4 dígitos, então você deve informar o ano com 4 dígitos.
Utilizando o método Parse
Outra forma, que é um pouco mais rápida, mas que pode te dar uma rasteira, é utilizando o método parse.
#Defining format...
datetime_in_string = "31/12/2000 - 23:59:59"
#Converting string to datetime...
result2 = parse(datetime_in_string)
print(result2)
No fonte acima, criei a mesma variável contendo a data 31/12/2000 – 23:59:59 mas, para converter, utilizei a função parse do pacote dateutil. Esta função irá tentar adivinhar o formato da data, com base em padrões mais utilizados. Isso pode parecer prático, mas lembre-se que aqui no Brasil nós utilizamos o padrão Dia/Mes/Ano e outros lugares utilizam Mes/Dia/Ano. Isso pode gerar problema com datas tipo 05/10 (5 de Outubro ou 10 de Maio?). Preferência pessoal aqui, mas a strptime é a que gosto de utilizar.
Guaxinim, de onde você está tirando estes formatos para as datas?
Excelente pergunta! Se você não conhece, existe um padrão que já está definido. Abaixo estão os valores mais comuns:
Código | Significado | Exemplo |
---|---|---|
%d | Dia do mês com dois dígitos (zero a esquerda) | 05 |
%-d | Dia do mes sem zero a esquerda | 5 |
%m | Número do mes com dois dígitos (zero a esquerda) | 08 |
%-m | Dia do mes sem zero a esquerda | 8 |
%Y | Ano com 4 digitos | 2018 |
%y | Ano com 2 digitos | 18 |
%H | Hora no formato 24h com zero a esquerda | 23 |
%-H | Hora no formato 24h sem zero a esquerda | 23 |
%M | Minutos com zero a esquerda | 06 |
%-M | Minutos zem zero a esquerda | 6 |
%S | Segundos com zero a esquerda | 23 |
%-S | Segundos sem zero a esquerda | 4 |
%f | Microsegundos como um número decimal (com 6 digitos e padding a esquerda) | 000012 |
A lista completa se encontra (em inglês) neste link.
Estas não são as únicas formas de se fazer isso utilizando o Python, mas acredito que elas já irão ajudar você a resolver os problemas de conversão.
Se quiser, o fonte deste post está no Github!
Espero ter ajudado.