Eu tenho um arquivo de despejo CSV de um backup do IPD do Blackberry, criado usando o IPDDump. As cadeias de data / hora aqui são mais ou menos assim (onde EST
é um fuso horário australiano):
Tue Jun 22 07:46:22 EST 2010
Eu preciso ser capaz de analisar esta data no Python. No começo, tentei usar a strptime()
função do horário do datett.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
No entanto, por algum motivo, o datetime
objeto que volta não parece ter nenhum tzinfo
associado.
Eu li nesta página que aparentemente datetime.strptime
descarta silenciosamente tzinfo
, no entanto, verifiquei a documentação e não consigo encontrar nada nesse sentido documentado aqui .
Consegui obter a data analisada usando uma biblioteca Python de terceiros, dateutil , no entanto, ainda estou curioso para saber como estava usando o construído strptime()
incorretamente? Existe alguma maneira strptime()
de jogar bem com os fusos horários?
Respostas:
A
datetime
documentação do módulo diz:Está vendo isso
[0:6]
? Isso te pega(year, month, day, hour, minute, second)
. Nada mais. Nenhuma menção de fusos horários.Curiosamente, [Win XP SP2, Python 2.6, 2.7] passando o seu exemplo para
time.strptime
não funciona, mas se você retirar o "% Z" e o "EST", ele funcionará. Também usando "UTC" ou "GMT" em vez de "EST" funciona. "PST" e "MEZ" não funcionam. Intrigante.Vale ressaltar que isso foi atualizado a partir da versão 3.2 e a mesma documentação agora também afirma o seguinte:
Observe que isso não funciona com% Z, portanto, o caso é importante. Veja o seguinte exemplo:
fonte
Eu recomendo usar python-dateutil . Seu analisador foi capaz de analisar todos os formatos de data que eu joguei até agora.
e assim por diante. Sem lidar com
strptime()
bobagens de formato ... basta lançar uma data para ela e ela faz a coisa certa.Atualização : Opa. Eu perdi na sua pergunta original que você mencionou que usava
dateutil
, desculpe por isso. Mas espero que essa resposta ainda seja útil para outras pessoas que se deparam com essa pergunta quando têm perguntas de análise de datas e veem a utilidade desse módulo.fonte
>>> parser.parse("Thu, 25 Sep 2003 10:49:41,123 -0300") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 748, in parse return DEFAULTPARSER.parse(timestr, **kwargs) File "/Users/wanghq/awscli/lib/python2.7/site-packages/dateutil/parser.py", line 310, in parse res, skipped_tokens = self._parse(timestr, **kwargs) TypeError: 'NoneType' object is not iterable
parser.parse("Thu, 25 Sep 2003 10:49:41.123 -0300") returns: datetime.datetime(2003, 9, 25, 10, 49, 41, 123000, tzinfo=tzoffset(None, -10800))
dateutil.parser.parse("10-27-2016 09:06 AM PDT")
retornos:datetime.datetime(2016, 10, 27, 9, 6)
falha para descobrir o fuso horário ...dateutil parser
pode ser simples de usar, masstrptime()
é mais rápido. Além disso, seus formatos são bastante fáceis de aprender.Sua sequência de horas é semelhante ao formato de hora na rfc 2822 (formato da data no email, cabeçalhos http) . Você pode analisá-lo usando apenas stdlib:
Veja soluções que geram objetos de data e hora com reconhecimento de fuso horário para várias versões do Python: analisando a data com o fuso horário de um email .
Nesse formato,
EST
é semanticamente equivalente a-0500
. Embora, em geral, uma abreviação de fuso horário não seja suficiente, para identificar um fuso horário exclusivamente .fonte
Encontrei exatamente esse problema.
O que acabei fazendo:
fonte