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 EST
hay 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 datetime
objeto que regresa no parece estar tzinfo
asociado con él.
Leí en esta página que aparentemente datetime.strptime
descarta 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
datetime
documentació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.strptime
no 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 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")
regresa:datetime.datetime(2016, 10, 27, 9, 6)
no puede determinar la zona horaria ...dateutil parser
Puede 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,
EST
es 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