comodín de tiempo de ejecución de python datetime
parsing strptime (5)
Quiero analizar fechas como estas en un objeto de fecha y hora:
- 12 de diciembre de 2008
- 1 de enero de 2009
Lo siguiente funcionará para la primera fecha:
datetime.strptime("December 12th, 2008", "%B %dth, %Y")
pero fallará para el segundo debido al sufijo del número del día (''st''). Entonces, ¿hay un carácter comodín no documentado en tiempo de ejecución? ¿O un mejor enfoque en conjunto?
Intente usar el módulo dateutil.parser.
import dateutil.parser
date1 = dateutil.parser.parse("December 12th, 2008")
date2 = dateutil.parser.parse("January 1st, 2009")
Puede encontrar documentación adicional aquí: http://labix.org/python-dateutil
Necesita http://labix.org/python-dateutil Gustavo Niemeyer - una vez que está instalado,
>>> from dateutil import parser
>>> parser.parse(''December 12th, 2008'')
datetime.datetime(2008, 12, 12, 0, 0)
>>> parser.parse(''January 1st, 2009'')
datetime.datetime(2009, 1, 1, 0, 0)
>>>
Para cualquier persona que, como yo, solo quiera algo que "funcione" sin un módulo adicional, esta es una solución rápida y sucia.
string_list = ["th", "rd", "nd", "st"]
time = None
for str in string_list:
if (time is not None):
break
try:
match_string = ''%B %d'' + str +'', %Y''
time = datetime.strptime("December 12th, 2008", match_string)
except Exception:
pass
Si desea usar comodines arbitrarios, puede usar datetime-glob , un módulo que desarrollamos para analizar fechas / horas de una lista de archivos generados por un formato de fecha / hora coherente. De la documentación del módulo:
>>> import datetime_glob
>>> matcher = datetime_glob.Matcher(
pattern=''/some/path/*%Y-%m-%dT%H-%M-%SZ.jpg'')
>>> matcher.match(path=''/some/path/some-text2016-07-03T21-22-23Z.jpg'')
datetime_glob.Match(year = 2016, month = 7, day = 3,
hour = 21, minute = 22, second = 23, microsecond = None)
>>> match.as_datetime()
datetime.datetime(2016, 7, 3, 21, 22, 23)
strptime es complicado porque se basa en la biblioteca de C subyacente para su implementación, por lo que algunos detalles difieren entre las plataformas. No parece haber una manera de hacer coincidir los caracteres que necesitas. Pero podrías limpiar los datos primero:
# Remove ordinal suffixes from numbers.
date_in = re.sub(r"(st|nd|rd|th),", ",", date_in)
# Parse the pure date.
date = datetime.strptime(date_in, "%B %d, %Y")