подстановочный знак python datetime strptime - PullRequest
17 голосов
/ 11 августа 2009

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

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

На первом свидании будет работать следующее:

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

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

Ответы [ 5 ]

18 голосов
/ 11 августа 2009

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

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

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

9 голосов
/ 11 августа 2009

Вам нужен Густаво Нимейер 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)
>>> 
8 голосов
/ 11 августа 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")
1 голос
/ 26 октября 2017

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

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
0 голосов
/ 25 марта 2018

Если вы хотите использовать произвольные символы подстановки, вы можете использовать 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)
...