подстановочный знак python datetime strptime

Я хочу разобрать такие даты в объект datetime:

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

Для первого свидания подойдет следующее:

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

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


person hoju    schedule 11.08.2009    source источник


Ответы (5)


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

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

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

person Community    schedule 11.08.2009
comment
python-dateutil, похоже, переехал. Документы находятся по адресу dateutil.readthedocs.org/en/latest, и на них есть ссылки. репозиторий github и страница pypi там. - person drevicko; 15.05.2015

Вам понадобится 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)
>>> 
person Alex Martelli    schedule 11.08.2009

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")
person Ned Batchelder    schedule 11.08.2009
comment
Я бы беспокоился о том, что это будет делать в августе. - person Blair Conrad; 11.08.2009
comment
Вот почему я поставил запятую в конце. - person Ned Batchelder; 11.08.2009
comment
Я бы сказал, что вам лучше добавить [\d]{1,2} перед вашим регулярным выражением. В конце концов, вы хотите сопоставлять суффиксы после чисел, верно? :-) - person Vince; 11.08.2009
comment
[\d]{1,2} будет соответствовать цифрам и также удалит их из даты, что не очень полезно! Вам нужен положительный взгляд на утверждение, чтобы убедиться, что st/nd/rd/th предшествует цифра, но не соответствует этой цифре, например: (?‹=\d)(st|nd|rd|th) - person Bartlett; 10.12.2012

Если вы хотите использовать произвольные подстановочные знаки, вы можете использовать datetime-glob, модуль, который мы разработали для анализировать дату/время из списка файлов, сгенерированных с помощью согласованного форматирования даты/времени. Из документации модуля:

>>> import datetime_glob
>>> matcher = datetime_glob.Matcher(
                         pattern='/some/path/*%Y-%m-%dT%H-%M-%SZ.jpg')

>>> matcher.match(path='/some/path/some-text2016-07-03T21-22-23Z.jpg')
datetime_glob.Match(year = 2016, month = 7, day = 3, 
                    hour = 21, minute = 22, second = 23, microsecond = None)

>>> match.as_datetime()
datetime.datetime(2016, 7, 3, 21, 22, 23)
person marko.ristin    schedule 25.03.2018
comment
Это было именно то, что мне было нужно :) - person Timothy C. Quinn; 24.08.2020

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

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
person winterly    schedule 26.10.2017