python - import dateutil
Usar dateutil.parser para analizar una fecha en otro idioma (2)
Podría usar PyICU
para analizar una cadena de fecha / hora localizada en un formato dado :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import datetime
import icu # PyICU
df = icu.SimpleDateFormat(
''EEE, dd MMM yyyy HH:mm:ss zzz'', icu.Locale(''pt_BR''))
ts = df.parse(u''Ter, 01 Out 2013 14:26:00 -0300'')
print(datetime.utcfromtimestamp(ts))
# -> 2013-10-01 17:26:00 (UTC)
Funciona en Python 2/3. No modifica el estado global (configuración regional).
Si su cadena de tiempo de entrada real no contiene el desplazamiento utc explícito, debe especificar una zona horaria para ser utilizada por la ICU explícitamente; de lo contrario, puede obtener un resultado incorrecto (ICU y datetime pueden usar diferentes definiciones de zona horaria).
Si solo necesitas admitir Python 3 y no te molesta configurar la configuración regional, puedes usar datetime.strptime()
como @alexwlchan sugirió :
#!/usr/bin/env python3
import locale
from datetime import datetime
locale.setlocale(locale.LC_TIME, "pt_PT.UTF-8")
print(datetime.strptime("Ter, 01 Out 2013 14:26:00 -0300",
"%a, %d %b %Y %H:%M:%S %z")) # works on Python 3.2+
# -> 2013-10-01 14:26:00-03:00
Dateutil es una gran herramienta para analizar fechas en formato de cadena. por ejemplo
from dateutil.parser import parse
parse("Tue, 01 Oct 2013 14:26:00 -0300")
devoluciones
datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))
sin embargo,
parse("Ter, 01 Out 2013 14:26:00 -0300") # In portuguese
produce este error:
ValueError: unknown string format
¿Alguien sabe cómo hacer que dateutil esté al tanto de la configuración regional?
Por lo que puedo ver, dateutil no es consciente de la configuración regional (¡aún!).
Puedo pensar en tres sugerencias alternativas:
Los nombres de día y mes están codificados en
dateutil.parser
(como parte de la claseparserinfo
). Podría subclase parserinfo y reemplazar estos nombres con los nombres apropiados para portugués.Modifique dateutil para obtener nombres de días y meses según la configuración regional del usuario. Entonces podrías hacer algo como
import locale locale.setlocale(locale.LC_ALL, "pt_PT") from dateutil.parser import parse parse("Ter, 01 Out 2013 14:26:00 -0300")
Empecé un fork que obtiene los nombres del módulo de
calendar
(que tiene en cuenta la configuración regional) para trabajar en esto: https://github.com/alexwlchan/dateutilEn este momento funciona para portugués (o parece), pero quiero pensarlo un poco más antes de enviar un parche a la rama principal. En particular, la rareza puede ocurrir si se enfrenta a caracteres que no se utilizan en los idiomas de Europa occidental. No he probado esto todavía. (Ver https://.com/a/8917539/1558022 )
Si no está vinculado al módulo dateutil, podría usar datetime en su lugar, que ya es compatible con la configuración regional:
from datetime import datetime, date import locale locale.setlocale(locale.LC_ALL, "pt_PT") datetime.strptime("Ter, 01 Out 2013 14:26:00 -0300", "%a, %d %b %Y %H:%M:%S %z")
(Tenga en cuenta que el token
%z
no es compatible sistemáticamente en fecha y hora ).