2012-04-26 15 views
5

Ho alcuni intervalli di date in stile umano, nelle stringhe, come il seguente:Parse data formato umana gamme in Python

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

voglio analizzare questi in Python in modo che possa finire con due datetime oggetti: uno per l'inizio, uno per la fine.

C'è qualche modulo che mi permetterà di fare questo? Ho provato parsedatetime, e sembra che la funzione evalRange all'interno possa farlo (vedi http://code-bear.com/code/parsedatetime/docs/index.html per la documentazione), ma non sembra analizzare nulla, e restituisce solo la data/ora corrente, due volte.

Qualche idea?

+1

robin, imho - con la varietà di queste stringhe regex di logica personalizzata e sono la soluzione migliore. -dc – dc5553

risposta

7

ho finito per scrivere un modulo Python per fare questo, che ho ora open-source. E 'disponibile per il download su Github, c'è documentation, e può essere installato da PyPI utilizzando:

pip install daterangeparser 

Per coloro che sono interessati, il modulo opere di creare un parser completo utilizzando PyParsing, un grande (e notevolmente strumento facile da usare).

+1

Fantastico! Grazie! –

2

È possibile utilizzare dateutil.parser. Ma non gestisce gli intervalli di date. Potrebbe essere necessario applicare un'espressione regolare prima.

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

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

saluti

0

Sulla base delle risposte precedenti, che cosa si potrebbe fare è:

  1. Preprocessa tuo ingresso in modo da ottenere la data di inizio e di fine (per esempio: 20th June e 5th July). Nel tuo primo esempio (date_range == 22-24th July 2012) è possibile farlo utilizzando date_range.split(' ')[0].split('-'): questo restituirà ['22', '24th'] (appena cadere il th e simili)
  2. Diventa datetime oggetti provenienti da tali date utilizzando dateutil.parser: dateutil.parser.parse('22 July 2012')

Ecco un'implementazione di ciò che è stato detto in precedenza:

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)