python datetime rfc2822

python - Convertir cadena a objeto datetime



rfc2822 (1)

Estaba tratando de convertir una cadena en un objeto de fecha y hora. La cadena que recibí de una fuente de noticias tiene el siguiente formato: "Jue, 16 de octubre de 2014 01:16:17 EDT"

Intenté usar datetime.strptime () para convertirlo. es decir,

datetime.strptime(''Thu, 16 Oct 2014 01:16:17 EDT'',''%a, %d %b %Y %H:%M:%S %Z'')

Y obtuvo el siguiente error:

Rastreo (llamadas recientes más última):
Archivo "", línea 1, en datetime.strptime (''jue, 16 oct 2014 01:16:17 EDT'', ''% a,% d% b% Y% H:% M:% S% Z'')
Archivo "C: / Anaconda / lib_strptime.py", línea 325, en _strptime (cadena_de_datos, formato))
ValueError: los datos de tiempo ''jue, 16 oct 2014 01:16:17 EDT'' no coinciden con el formato ''% a,% d% b% Y% H:% M:% S% Z''

Sin embargo, si probé la cadena sin "EDT", funcionó. es decir,

datetime.strptime(''Thu, 16 Oct 2014 01:16:17'',''%a, %d %b %Y %H:%M:%S'')

¿Alguien sabe cómo analizar esa parte "EDT"?


Para analizar la fecha en formato RFC 2822 , puede usar el paquete de email :

from datetime import datetime, timedelta from email.utils import parsedate_tz, mktime_tz timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT")) # -> 1413436577 utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp) # -> datetime.datetime(2014, 10, 16, 5, 16, 17)

Nota: parsedate_tz() supone que EDT corresponde a un desplazamiento de -0400 UTC pero podría ser incorrecto en Australia donde EDT es +1100 ( +1100 usa pytz en este caso), es decir, una abreviatura de zona horaria puede ser ambigua. ¿Ver análisis de cadena de fecha / hora con nombre abreviado de zona horaria en Python?

Error relacionado con Python: % Z en strptime no coincide con EST y otros .

Si su computadora usa marcas de tiempo POSIX (probablemente), y está seguro de que la fecha de entrada está dentro de un rango aceptable para su sistema (no demasiado lejos en el futuro / pasado), y no necesita preservar la precisión de microsegundos, entonces podría use datetime.utcfromtimestamp :

from datetime import datetime from email.utils import parsedate_tz, mktime_tz timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT")) # -> 1413436577 utc_dt = datetime.utcfromtimestamp(timestamp) # -> datetime.datetime(2014, 10, 16, 5, 16, 17)