Python strptime () y zonas horarias?

Tengo un archivo de volcado CSV de una copia de seguridad de Blackberry IPD, creado con IPDDump. Las cadenas de fecha / hora aquí se parecen a esto (donde EST es una zona horaria australiana):

 Tue Jun 22 07:46:22 EST 2010 

Necesito poder analizar esta fecha en Python. Al principio, intenté usar la función strptime() de datetime.

 >>> 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 objeto de datetime que regresa no parece tener asociado ningún tzinfo .

Sí, leí en esta página que aparentemente datetime.strptime descarta tzinfo silenciosa, sin embargo, verifiqué la documentación y no puedo encontrar nada a tal efecto documentado aquí .

He podido obtener la fecha de análisis utilizando una biblioteca de Python de terceros, dateutil , sin embargo, sigo sintiendo curiosidad por saber cómo estaba utilizando incorrectamente el strptime() incorporado en la strptime() . ¿Hay alguna forma de que strptime() juegue bien con las zonas horarias?

La documentación del módulo datetime dice:

Devuelve una fecha correspondiente a date_string, analizada según el formato. Esto es equivalente a datetime(*(time.strptime(date_string, format)[0:6])) .

¿Ves que [0:6] ? Eso te atrapa (year, month, day, hour, minute, second) . Nada más. No hay mención de zonas horarias.

Curiosamente, [Win XP SP2, Python 2.6, 2.7] pasar su ejemplo a time.strptime no funciona, pero si time.strptime el “% Z” y el “EST”, funciona. También el uso de “UTC” o “GMT” en lugar de “EST” funciona. “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 dice lo siguiente:

Cuando se proporciona la directiva% z al método strptime (), se producirá un objeto datetime consciente. El tzinfo del resultado se establecerá en una instancia de zona horaria.

Tenga en cuenta que esto no funciona con% Z, por lo que el caso es importante. Vea el siguiente ejemplo:

 In [1]: from datetime import datetime In [2]: start_time = datetime.strptime('2018-04-18-17-04-30-AEST','%Y-%m-%d-%H-%M-%S-%Z') In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname())) TZ NAME: None In [4]: start_time = datetime.strptime('2018-04-18-17-04-30-+1000','%Y-%m-%d-%H-%M-%S-%z') In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname())) TZ NAME: UTC+10:00 

Recomiendo usar python-dateutil . Su analizador ha podido analizar todos los formatos de fecha que le he lanzado hasta ahora.

 >>> from dateutil import parser >>> parser.parse("Tue Jun 22 07:46:22 EST 2010") datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal()) >>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400") datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400)) >>> parser.parse("Sun") datetime.datetime(2011, 12, 18, 0, 0) >>> parser.parse("10-11-08") datetime.datetime(2008, 10, 11, 0, 0) 

y así. No se trata de tonterías en formato strptime() … solo lance una fecha y se encargará de hacer lo correcto.

Actualización : Ups. dateutil en tu pregunta original que mencionaste que dateutil , perdón por eso. Pero espero que esta respuesta todavía sea útil para otras personas que se encuentran con esta pregunta cuando tienen preguntas de análisis de fecha y ven la utilidad de ese módulo.

Su cadena de tiempo es similar al formato de hora en rfc 2822 (formato de fecha en correo electrónico, encabezados http) . Podrías analizarlo usando solo stdlib:

 >>> from email.utils import parsedate_tz >>> parsedate_tz('Tue Jun 22 07:46:22 EST 2010') (2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000) 

Vea soluciones que producen objetos de fecha y hora compatibles con la zona horaria para varias versiones de Python: análisis de la fecha con la zona horaria desde un correo electrónico .

En este formato, EST es semánticamente equivalente a -0500 . Aunque, en general, una abreviación de zona horaria no es suficiente, para identificar una zona horaria de forma única .