3

Есть строка с датой:

f = '05 марта 2015, 13:00'

Моя цель - перевести дату в формат, принимаемый полем mysql, пользоваться буду функцией:

time.strftime('%Y-%m-%d %H:%M:%S')

Но сейчаc нужно вытащить дату, и вопрос состоит в том, как это реализовать?

Пытался:

d1 = datetime.datetime.strptime('05 марта 2015, 13:00', '%d Month %Y, %H:%M')

print d1

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

5
  • 2
    Разбить по всем разделителям (пробелы, запятые, двоеточия), все числа преобразовать в int, а для определения номера месяца создать словарь вида {'января':1, 'февраля':2, ...}.
    – insolor
    5 мар 2015 в 20:35
  • @insolor, спасибо, получается только так, правдо с локалью еще были идеи, но там свои подводные камни.
    – AlexeyAl
    6 мар 2015 в 7:38
  • А если сделать 12 замен русского месяца на английский или число, тогда оно возьмется обычной мавкой
    – LinnTroll
    6 мар 2015 в 14:54
  • @LinnTroll, мое чувство прекрасного мне бы не позволило так сделать. Лучше уж выделить название месяца через регулярные выражения и сделать одну замену по словарю. Но вариант с полным разбиением все равно считаю самым оптимальным.
    – insolor
    7 мар 2015 в 11:11
  • вот решения, использующие setlocale(), PyICU, str.replace() чтобы дату на русском языке распознать. Или если формат даты точно не известен, то можно dateparser попробовать
    – jfs
    10 мар 2016 в 0:12

1 ответ 1

3

В соответствии с рекомендациями в комментариях к вопросу, реализация:

from datetime import datetime

RU_MONTH_VALUES = {
    'января': 1,
    'февраля': 2,
    'марта': 3,
    'апреля': 4,
    'мая': 5,
    'июня': 6,
    'июля': 7,
    'августа': 8,
    'сентября': 9,
    'октября': 10,
    'ноября': 11,
    'декабря': 12,
}


def int_value_from_ru_month(date_str):
    for k, v in RU_MONTH_VALUES.items():
        date_str = date_str.replace(k, str(v))

    return date_str


date_str = '05 марта 2015, 13:00'
date_str = int_value_from_ru_month(date_str)
print date_str

d = datetime.strptime(date_str, '%d %m %Y, %H:%M')
print d
print d.strftime('%d %B %Y, %H:%M')

Консоль:

05 3 2015, 13:00
2015-03-05 13:00:00
05 March 2015, 13:00
5
  • fix: 'ноября': 11, 3 ноя 2019 в 10:54
  • @DenisTrofimov, done :)
    – gil9red
    3 ноя 2019 в 12:10
  • Если хочешь улучшить. Поскольку идет перебор всего содержимого RU_MONTH_VALUES, хэш-таблица используется не для поиска, и это трата времен и памяти. Посмотри как написано в ru.stackoverflow.com/a/419422/233248 for old, new in [('Март', '3'), ('Сен.', '9'), ('Апрель', '4')]: и даже лучше tuple (('Март', '3'), ('Сен.', '9'), ('Апрель', '4')) 4 ноя 2019 в 16:40
  • @DenisTrofimov, оформите это ваше предложение как свой ответ :) а так, я согласен, что словарь тут излишен и спокойно заменяем на кортеж
    – gil9red
    4 ноя 2019 в 20:45
  • ваш код нашел мой студент, и я благодарен вам. Ему это было полезно, мне интересно. 5 дек 2019 в 15:47

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.