Библиотека, которая мне очень нравится, и я вижу, что ее используют все больше и больше людей, это python-dateutil , но, к сожалению, ни она, ни другой традиционный большой анализатор даты и времени, mxDateTime от Egenix может анализировать слово "завтра", несмотря на то, что обе библиотеки имеют очень сильные "нечеткие" парсеры.
Единственная библиотека, которую я видел, может это сделать magicdate . Примеры:
>>> import magicdate
>>> magicdate.magicdate('today')
datetime.date(2009, 2, 15)
>>> magicdate.magicdate('tomorrow')
datetime.date(2009, 2, 16)
>>> magicdate.magicdate('yesterday')
datetime.date(2009, 2, 14)
К сожалению, это только возвращает объекты datetime.date, поэтому не включает части времени и не может обработать ваш пример «Сегодня 15:20».
Итак, для этого вам нужен mxDateTime. Примеры:
>>> import mx.DateTime
>>> mx.DateTime.Parser.DateTimeFromString("Today 3:20 PM")
<mx.DateTime.DateTime object for '2009-02-15 15:20:00.00' at 28faa28>
>>> mx.DateTime.Parser.DateTimeFromString("Tomorrow 5:50 PM")
<mx.DateTime.DateTime object for '2009-02-15 17:50:00.00' at 2a86088>
РЕДАКТИРОВАТЬ: mxDateTime.Parser только анализирует время в этих примерах и игнорирует слова «сегодня» и «завтра». Поэтому для этого конкретного случая вам нужно использовать комбо из magicdate, чтобы получить дату, и mxDateTime, чтобы получить время. Я рекомендую просто использовать python-dateutils или mxDateTime и принимать только те строковые форматы, которые они могут анализировать.
РЕДАКТИРОВАТЬ 2: Как отмечается в комментариях, Python-dateutil теперь может обрабатывать нечеткий анализ. С тех пор я также обнаружил модуль parsedatetime , который был разработан для использования в Chandler, и он работает с запросами в этом вопросе:
>>> import parsedatetime.parsedatetime as pdt
>>> import parsedatetime.parsedatetime_consts as pdc
>>> c=pdc.Constants()
>>> p=pdt.Calendar(c)
>>> p.parse('Today 3:20 PM')
((2010, 3, 12, 15, 20, 0, 4, 71, -1), 3)
>>> p.parse('Yesterday 11:06 AM')
((2010, 3, 11, 11, 6, 0, 3, 70, -1), 3)
и для справки здесь указано текущее время:
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2010, 3, 12, 15, 23, 35, 951652)