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)