2012-04-26 14 views
5

que tienen algunos rangos de fechas al estilo humano, en cadenas, como la siguiente:Parse rangos de fechas de formato humana en Python

22-24th April 2012 
14-23 July 
20th June - 5th July 

Quiero analizar estos en Python para que pueda terminar con dos de fecha y hora objetos: uno para el comienzo, uno para el final.

¿Hay algún módulo que me permita hacer esto? He intentado parsedatetime, y parece que la función evalRange dentro de eso puede hacerlo (ver http://code-bear.com/code/parsedatetime/docs/index.html para documentación), pero no parece analizar nada en absoluto, y simplemente devuelve la fecha/hora actual, dos veces.

¿Alguna idea?

+1

robin, en mi humilde opinión - con la variedad de estas cadenas de expresiones regulares y de lógica personalizada son la mejor opción. -dc – dc5553

Respuesta

7

terminé escribiendo un módulo de Python para hacer esto, que tengo ahora generados en la abierta. Está disponible para su descarga en Github, hay documentation, y puede ser instalado desde PyPI usando:

pip install daterangeparser 

Para aquellos que estén interesados, funciona el módulo mediante la creación de un programa de análisis completo utilizando PyParsing, un gran (y notablemente fácil de usar) herramienta.

+1

¡Impresionante! ¡Gracias! –

2

Puede usar dateutil.parser. Pero no maneja los rangos de fechas. Es posible que deba aplicar una expresión regular antes.

import dateutil.parser 
dateutil.parser.parse("20th June") 

vuelve datetime.datetime(2012, 6, 20, 0, 0)

Saludos

0

Con base en las respuestas anteriores, lo que podría hacer es:

  1. preproceso su entrada de forma que se obtiene la fecha de comienzo y el final (por ejemplo: 20th June y 5th July). En el primer ejemplo (date_range == 22-24th July 2012) que puede hacer que mediante el uso date_range.split(' ')[0].split('-'): esto devolverá ['22', '24th'] (simplemente dejar caer el th y similares)
  2. Get datetime objetos a partir de esas fechas utilizando dateutil.parser: dateutil.parser.parse('22 July 2012')

Aquí es una implementación de lo que antes era, dijo:

import dateutil.parser 
date_range = '20-22th July 2013' 
date_range = date_range.lower() 
for suffix in {'th', 'rd', 'st'}: 
    date_range.replace(suffix, '') 
days = date_range.split(' ')[0].split('-') 
month_year = date_range.split(' ')[1] 
begin, end = days[0] + ' ' + month_year, days[1] + ' ' + month_year 
begin_date = dateutil.parser.parse(begin) 
end_date = dateutil.parser.parse(end)