Tengo un archivo de volcado CSV de una copia de seguridad de Blackberry IPD, creado usando IPDDump. Las cadenas de fecha / hora aquí se parecen a esto (donde ESThay una zona horaria australiana):
Tue Jun 22 07:46:22 EST 2010
Necesito poder analizar esta fecha en Python. Al principio, traté de usar la strptime()función desde datettime.
>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')
Sin embargo, por alguna razón, el datetimeobjeto que regresa no parece estar tzinfoasociado con él.
Leí en esta página que aparentemente datetime.strptimedescarta en silencio tzinfo, sin embargo, verifiqué la documentación y no puedo encontrar nada documentado a tal efecto aquí .
He podido analizar la fecha usando una biblioteca de Python de terceros, dateutil , pero todavía tengo curiosidad sobre cómo estaba usando strptime()incorrectamente la versión incorporada . ¿Hay alguna forma strptime()de jugar bien con las zonas horarias?

Respuestas:
La
datetimedocumentación del módulo dice:¿Ves eso
[0:6]? Eso te atrapa(year, month, day, hour, minute, second). Nada más. No se mencionan las zonas horarias.Curiosamente, [Win XP SP2, Python 2.6, 2.7] pasando su ejemplo a
time.strptimeno funciona, pero si quita el "% Z" y el "EST" sí funciona. También utiliza "UTC" o "GMT" en lugar de "EST". "PST" y "MEZ" no funcionan. Misterioso.Vale la pena señalar que esto se ha actualizado a partir de la versión 3.2 y la misma documentación ahora también establece lo siguiente:
Tenga en cuenta que esto no funciona con% Z, por lo que el caso es importante. Vea el siguiente ejemplo:
fuente
Recomiendo usar python-dateutil . Su analizador ha sido capaz de analizar todos los formatos de fecha que he incluido hasta ahora.
y así. No se trata de
strptime()tonterías de formato ... solo dale una fecha y hace lo correcto.Actualización : ¡Vaya! Me perdí en tu pregunta original que mencionaste que usaste
dateutil, perdón por eso. Pero espero que esta respuesta siga siendo útil para otras personas que se topan con esta pregunta cuando tienen preguntas de análisis de fechas y ven la utilidad de ese módulo.fuente
>>> 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 iterableparser.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")regresa:datetime.datetime(2016, 10, 27, 9, 6)no puede determinar la zona horaria ...dateutil parserPuede ser simple de usar, perostrptime()es más rápido. Además, sus formatos son bastante fáciles de aprender.Su cadena de tiempo es similar al formato de hora en rfc 2822 (formato de fecha en correo electrónico, encabezados http) . Puede analizarlo usando solo stdlib:
Vea soluciones que producen objetos de fecha y hora con reconocimiento de zona horaria para varias versiones de Python: análisis de fecha con zona horaria desde un correo electrónico .
En este formato,
ESTes semánticamente equivalente a-0500. Aunque, en general, una abreviatura de zona horaria no es suficiente, para identificar una zona horaria de forma única .fuente
Me encontré con este problema exacto.
Lo que terminé haciendo:
fuente