Как получить datetime из строки, содержащей «2nd» для даты в Python?

У меня есть пара строк, из которых я хочу получить datetime. Они отформатированы следующим образом:

Thu 2nd May 2013 19:00 

Я знаю почти, как я могу преобразовать это в datetime, за исключением того, что у меня возникают проблемы с «2- й ». Теперь у меня есть следующее

 >>> datetime.strptime('Thu 02 May 2013 19:00', '%a %d %B %Y %H:%M') datetime.datetime(2013, 5, 2, 19, 0) 

который отлично работает с нулевым заполненным номером за день месяца, но когда я пытаюсь выполнить 2nd , он дает ValueError:

 >>> datetime.strptime('Thu 2nd May 2013 19:00', '%a %d %B %Y %H:%M') Traceback (most recent call last): File "<input>", line 1, in <module> (data_string, format)) ValueError: time data 'Thu 2nd May 2013 19:00' does not match format '%a %d %B %Y %H:%M' 

В списке директив datetime я не могу найти ничего, относящееся к упорядоченным значениям (1-й, 2-й, 3-й и т. Д.) Для дат. Кто-нибудь знает, как я могу заставить это работать? Все советы приветствуются!

4 Solutions collect form web for “Как получить datetime из строки, содержащей «2nd» для даты в Python?”

Рассмотрите возможность использования dateutil.parser.parse .

Это сторонняя библиотека с мощным парсером, который может обрабатывать такие вещи.

 from dateutil.parser import parse s = 'Thu 2nd May 2013 19:00' d = parse(s) print(d, type(d)) # 2013-05-02 19:00:00 <class 'datetime.datetime'> 

Краткий оговорка (на самом деле не происходит в вашем случае): если dateutil не может найти аспект вашей даты в строке (скажем, вы оставляете вне месяца), то по умолчанию будет использоваться аргумент по default . Это значение по умолчанию соответствует текущей дате со временем 00:00:00. Очевидно, вы можете переписать это при необходимости с другим объектом datetime .

Самый простой способ установить dateutil – это, вероятно, использовать pip с командой pip install python-dateutil .

Вы можете подготовить исходную строку, чтобы настроить день, подходящий для вашего strptime , например:

 from datetime import datetime import re s = 'Thu 2nd May 2013 19:00' amended = re.sub('\d+(st|nd|rd|th)', lambda m: m.group()[:-2].zfill(2), s) # Thu 02 May 2013 19:00 dt = datetime.strptime(amended, '%a %d %B %Y %H:%M') # 2013-05-02 19:00:00 

Исключить суффикс с даты можно без использования регулярных выражений или внешней библиотеки.

 def remove_date_suffix(s): parts = s.split() parts[1] = parts[1].strip("stndrh") # remove 'st', 'nd', 'rd', ... return " ".join(parts) 

Тогда это так же просто, как использование strptime как и следовало ожидать:

 >>> s = "Thu 2nd May 2013 19:00" >>> remove_date_suffix(s) 'Thu 2 May 2013 19:00' >>> datetime.strptime(remove_date_suffix(s), '%a %d %B %Y %H:%M') datetime.datetime(2013, 5, 2, 19, 0) 
 import re from datetime import datetime def proc_date(x): return re.sub(r"\b([0123]?[0-9])(st|th|nd|rd)\b",r"\1",x) >>> x='Thu 2nd May 2013 19:00' >>> proc_date(x) 'Thu 2 May 2013 19:00' >>> datetime.strptime(proc_date(x), '%a %d %B %Y %H:%M') datetime.datetime(2013, 5, 2, 19, 0) 
  • Pandas и применить функцию для соответствия строке
  • Отображение символов юникода с использованием python
  • Строка Python с пространством и без пространства в конце и неизменяемость
  • Примеры поиска строк в Python
  • sys.argv как байты в Python 3k
  • Как выполнить строку, содержащую код Python в Python?
  • struct.error: unpack требует строкового аргумента длиной 2
  • Разделение строк в требуемом формате, Pythonic? (с или без Regex)
  • Python - лучший язык программирования в мире.