create - Python strptime() y zonas horarias?
strftime python (3)
La documentación del módulo de datetime
dice:
Devuelve un datetime correspondiente a date_string, analizado según el formato. Esto es equivalente a
datetime(*(time.strptime(date_string, format)[0:6]))
.
¿Ves eso [0:6]
? Eso te atrapa (year, month, day, hour, minute, second)
. Nada más. Sin mención de 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" funciona. También funciona "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:
Cuando se proporciona la directiva% z al método strptime (), se producirá un objeto de fecha y hora 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
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
es 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 función strptime()
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 objeto datetime
que vuelve no parece tener ningún tzinfo
asociado.
Leí en esta página que aparentemente datetime.strptime
descarta silenciosamente tzinfo
, sin embargo, revisé la documentación y no puedo encontrar nada documentado here .
He podido analizar la fecha usando una biblioteca de Python de terceros, dateutil , sin embargo, todavía tengo curiosidad sobre cómo estaba usando el strptime()
integrado strptime()
incorrectamente. ¿Hay alguna manera de hacer que strptime()
juegue bien con las zonas horarias?
Recomiendo usar dateutil . Su analizador ha podido analizar cada formato de fecha que he lanzado hasta el momento.
>>> 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 hay que lidiar con tonterías de formato strptime()
... simplemente strptime()
una fecha y hace lo correcto.
Actualización : Oops. Me perdí en tu pregunta original que mencionaste que dateutil
, lo siento. Pero espero que esta respuesta siga siendo útil para otras personas que tropiezan con esta pregunta cuando tienen preguntas para analizar la fecha y ver la utilidad de ese módulo.
Su cadena de tiempo es similar al formato de hora en rfc 2822 (formato de fecha en el 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)
Consulte las soluciones que producen objetos datetime con reconocimiento de zona horaria para varias versiones de Python: fecha de análisis con zona horaria de 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 manera única .