Какой лучший способ сделать время из «Сегодня» или «Вчера» и время в Python? - PullRequest
9 голосов
/ 16 февраля 2009

Python имеет довольно хороший анализ даты, но это единственный способ распознать дату, например, «Сегодня 15:20» или «Вчера 11:06», создав новую дату сегодня и выполнив вычитания?

Ответы [ 2 ]

18 голосов
/ 16 февраля 2009

Библиотека, которая мне очень нравится, и я вижу, что ее используют все больше и больше людей, это 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)
0 голосов
/ 16 февраля 2009

Я еще не совсем разбираюсь в Python, но ваш вопрос меня заинтересовал, поэтому я немного покопался.

Вычитание даты с использованием timedelta является наиболее распространенным решением, которое я нашел.

Поскольку ваш вопрос спрашивает, является ли это only способом сделать это, я проверил коды формата strftime, чтобы увидеть, можете ли вы определить свой собственный. К сожалению нет. Из документации strftime Python :

... Полный набор поддерживаемых кодов формата варьируется в зависимости от платформы, потому что Python вызывает функцию strftime () библиотеки С, и изменения платформы распространены.

Ниже приведен список всех кодов формата, которые требуются в стандарте C (версия 1989 года) ...

Во всяком случае, это не окончательный ответ, но, может быть, это сэкономит время других на лайке неправильного дерева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...