Подтвердить что ты не робот

Python datetime strptime wildcard

Я хочу анализировать даты, подобные этим, в объект datetime:

  • 12 декабря 2008 г.
  • 1 января 2009 г.

Следующее будет работать в течение первой даты:

datetime.strptime("December 12th, 2008", "%B %dth, %Y")

но не будет работать для второго из-за суффикса к номеру дня ('st'). Итак, есть ли недопустимый шаблон подстановки в strptime? Или лучший подход вообще?

4b9b3361

Ответ 1

Попробуйте использовать модуль dateutil.parser.

import dateutil.parser
date1 = dateutil.parser.parse("December 12th, 2008")
date2 = dateutil.parser.parse("January 1st, 2009")

Дополнительную документацию можно найти здесь: http://labix.org/python-dateutil

Ответ 2

Вам нужно Gustavo Niemeyer python_dateutil - после его установки

>>> from dateutil import parser
>>> parser.parse('December 12th, 2008')
datetime.datetime(2008, 12, 12, 0, 0)
>>> parser.parse('January 1st, 2009')
datetime.datetime(2009, 1, 1, 0, 0)
>>> 

Ответ 3

strptime сложно, потому что он использует базовую библиотеку C для ее реализации, поэтому некоторые детали отличаются между платформами. Кажется, что нет способа сопоставить персонажей, которые вам нужны. Но сначала вы можете очистить данные:

# Remove ordinal suffixes from numbers.
date_in = re.sub(r"(st|nd|rd|th),", ",", date_in)
# Parse the pure date.
date = datetime.strptime(date_in, "%B %d, %Y")

Ответ 4

Для тех, кто, как и я, просто хочу что-то, что "работает" без дополнительного модуля, это быстрое и грязное решение.

string_list = ["th", "rd", "nd", "st"]
time = None
for str in string_list:
    if (time is not None):
        break
    try:
        match_string = '%B %d' + str +', %Y'
        time = datetime.strptime("December 12th, 2008", match_string)
    except Exception:
        pass