2012-04-26 15 views
5

Ich habe einige Menschen Stil Datumsbereiche, in Strings, wie folgt aus:Parst Mensch-Format Datumsbereiche in Python

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

ich diese in Python analysieren will, so dass ich mit zwei Datetime kann am Ende Objekte: eine für den Anfang, eine für das Ende.

Gibt es ein Modul, mit dem ich das machen kann? Ich habe versucht parsedatetime, und es sieht aus wie die evalRange Funktion innerhalb kann es tun (siehe http://code-bear.com/code/parsedatetime/docs/index.html für die Dokumentation), aber es scheint überhaupt nichts zu parsen, und gibt nur das aktuelle Datum/Uhrzeit, zweimal zurück.

Irgendwelche Ideen?

+1

robin, imho - mit der Vielfalt dieser Strings regex ist und benutzerdefinierte Logik sind die beste Wahl. -dc – dc5553

Antwort

7

ich das am Ende ein Python-Modul Schreiben zu tun, was ich jetzt Open-Source haben. Es steht zum Download bereit auf Github, gibt es documentation, und es kann von PyPI mit installiert werden:

pip install daterangeparser 

Für diejenigen, die interessiert sind, arbeitet das Modul durch einen vollständigen Parser PyParsing erstellen, eine große (und bemerkenswert einfach zu bedienendes) Werkzeug.

+1

Super! Vielen Dank! –

2

Sie könnten dateutil.parser verwenden. Es werden jedoch keine Datumsbereiche behandelt. Möglicherweise müssen Sie zuvor einen regulären Ausdruck anwenden.

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

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

Grüße

0

Basierend auf früheren Antworten, was Sie tun können, ist:

  1. Präprozessor auf Ihren Eingang, so dass Sie den Anfang und das Enddatum erhalten (zum Beispiel: 20th June und 5th July). In Ihrem ersten Beispiel (date_range == 22-24th July 2012) können Sie das tun date_range.split(' ')[0].split('-') unter Verwendung: diese ['22', '24th'] zurück (nur die th und ähnliches fallen)
  2. Erhalten datetime Objekte aus diesen Terminen dateutil.parser mit: dateutil.parser.parse('22 July 2012')

Hier ist eine Implementierung von was zuvor gesagt:

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)