2009-08-11 3 views
16

Я хочу, чтобы разобрать даты, как это в Задан объект:питон DateTime strptime подстановочные

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

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

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

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

ответ

18

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

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

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

+0

python-dateutil выглядит перемещенным. Документы находятся на странице https://dateutil.readthedocs.org/en/latest/, и есть ссылки на его репозиторий github и страницу pypi. – drevicko

7

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") 
+6

Я буду беспокоиться о том, что это будет делать до августа. –

+1

Вот почему я включил конечную запятую. –

+1

Я бы сказал, что вам лучше добавить [\ d] {1,2} перед вашим регулярным выражением. В конце концов, вы хотите сопоставить суффиксы после чисел, не так ли? :-) – Vince

9

Вам нужно Густаво Нимейера 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) 
>>> 
1

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

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 
Смежные вопросы