Convertir una hora RFC 3339 en una marca de tiempo de Python estándar
datetime rfc3339 (11)
Al usar Python 3, puede usar RegEx para dividir la marca de tiempo RFC 3339 en sus componentes. Luego, cree directamente el objeto datetime, no se necesitan módulos adicionales:
import re
import datetime
def parse_rfc3339(dt):
broken = re.search(r''([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(/.([0-9]+))?(Z|([+-][0-9]{2}):([0-9]{2}))'', dt)
return(datetime.datetime(
year = int(broken.group(1)),
month = int(broken.group(2)),
day = int(broken.group(3)),
hour = int(broken.group(4)),
minute = int(broken.group(5)),
second = int(broken.group(6)),
microsecond = int(broken.group(8) or "0"),
tzinfo = datetime.timezone(datetime.timedelta(
hours = int(broken.group(10) or "0"),
minutes = int(broken.group(11) or "0")))))
Este ejemplo muestra las zonas horarias o microsegundos que faltan como "0", pero puede necesitar una verificación de errores adicional. Saludos alex
¿Hay una manera fácil de convertir una hora RFC 3339 en una marca de tiempo de Python regular?
Tengo un script que está leyendo un feed ATOM y me gustaría poder comparar la marca de tiempo de un elemento en el feed ATOM con la hora de modificación de un archivo.
Observo por la especificación de ATOM que las fechas de ATOM incluyen un desplazamiento de zona horaria ( Z<a number>
) pero, en mi caso, no hay nada después de la Z
así que supongo que podemos asumir GMT.
Supongo que podría analizar el tiempo con una expresión regular de algún tipo, pero esperaba que Python tuviera una forma integrada de hacerlo que simplemente no he podido encontrar.
Biblioteca rfc3339: http://henry.precheur.org/python/rfc3339
Luché mucho con el formato de fecha y hora RFC3339, pero encontré una solución adecuada para convertir date_string <=> datetime_object en ambas direcciones.
Necesita dos módulos externos diferentes, porque uno de ellos solo es capaz de hacer la conversión en una dirección (desafortunadamente):
primera instalación:
sudo pip install rfc3339
sudo pip install iso8601
luego incluye:
import datetime # for general datetime object handling
import rfc3339 # for date object -> date string
import iso8601 # for date string -> date object
Para no tener que recordar qué módulo es para qué dirección, escribí dos funciones simples de ayuda:
def get_date_object(date_string):
return iso8601.parse_date(date_string)
def get_date_string(date_object):
return rfc3339.rfc3339(date_object)
que dentro de tu código puedes usar fácilmente así:
input_string = ''1989-01-01T00:18:07-05:00''
test_date = get_date_object(input_string)
# >>> datetime.datetime(1989, 1, 1, 0, 18, 7, tzinfo=<FixedOffset ''-05:00'' datetime.timedelta(-1, 68400)>)
test_string = get_date_string(test_date)
# >>> ''1989-01-01T00:18:07-05:00''
test_string is input_string # >>> True
Heureka! Ahora puede ( jaja ) usar fácilmente las cadenas de fecha y las cadenas de fecha en un formato utilizable.
No construido, afaik.
feed.date.rfc3339 Este es un módulo de biblioteca de Python con funciones para convertir cadenas de marca de tiempo en formato RFC 3339 a valores flotantes de tiempo de Python, y viceversa. RFC 3339 es el formato de marca de tiempo utilizado por el formato de sindicación de fuentes Atom.
Tiene licencia BSD.
http://home.blarg.net/~steveha/pyfeed.html
(Editado para que quede claro que no lo escribí .--)
No incluye un ejemplo, pero si no tiene un desplazamiento en Z o una zona horaria, y suponiendo que no desea duraciones sino solo el tiempo básico, tal vez esto sea adecuado para usted:
import datetime as dt
>>> dt.datetime.strptime(''1985-04-12T23:20:50.52'', ''%Y-%m-%dT%H:%M:%S.%f'')
datetime.datetime(1985, 4, 12, 23, 20, 50, 520000)
La función strptime () se agregó al módulo datetime en Python 2.5, por lo que algunas personas aún no saben que está ahí.
Edición : la función time.strptime () ha existido por un tiempo, y funciona de la misma manera para darle un valor de struct_time:
>>> ts = time.strptime(''1985-04-12T23:20:50.52'', ''%Y-%m-%dT%H:%M:%S.%f'')
>>> ts
time.struct_time(tm_year=1985, tm_mon=4, tm_mday=12, tm_hour=23, tm_min=20, tm_sec=50, tm_wday=4, tm_yday=102, tm_isdst=-1)
>>> time.mktime(ts)
482210450.0
Si está usando Django, podría usar la función parse_datetime
Django:
>>> from django.utils.dateparse import parse_datetime
>>> parse_datetime("2016-07-19T07:30:36+05:00")
datetime.datetime(2016, 7, 19, 7, 30, 36, tzinfo=<django.utils.timezone.FixedOffset object at 0x101c0c1d0>)
prueba esto, funciona bien para mi
datetime_obj = datetime.strptime("2014-01-01T00:00:00Z", ''%Y-%m-%dT%H:%M:%SZ'')
o
datetime_obj = datetime.strptime("Mon, 01 Jun 2015 16:41:40 GMT", ''%a, %d %b %Y %H:%M:%S GMT'')
http://bugs.python.org/issue15873 (duplicado de http://bugs.python.org/issue5207 )
Parece que no hay una incorporada todavía.
feedparser.py proporciona una forma robusta / extensible para analizar varios formatos de fecha que pueden encontrarse en las fuentes atom / rss del mundo real:
>>> from feedparser import _parse_date as parse_date
>>> parse_date(''1985-04-12T23:20:50.52Z'')
time.struct_time(tm_year=1985, tm_mon=4, tm_mday=12, tm_hour=23, tm_min=20,
tm_sec=50, tm_wday=4, tm_yday=102, tm_isdst=1)
http://pypi.python.org/pypi/iso8601/ parece ser capaz de analizar iso 8601, del cual RFC 3339 es un subconjunto de, tal vez esto podría ser útil, pero nuevamente, no está incorporado.
dateutil.parser el increíble módulo dateutil.parser en otra pregunta y lo probé en mi problema RFC3339, y parece manejar todo lo que le ofrezco con más cordura que cualquiera de las otras respuestas en esta pregunta.