название месяца к номеру месяца и наоборот в python


96

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

Я думал о модуле календаря . Я вижу, что для преобразования номера месяца в сокращенное название месяца вы можете просто сделать calendar.month_abbr[num]. Однако я не вижу возможности пойти в другом направлении. Будет ли создание словаря для преобразования другого направления лучшим способом справиться с этим? Или есть лучший способ перейти от названия месяца к номеру месяца и наоборот?

Ответы:


98

Создайте обратный словарь с помощью calendarмодуля (который, как и любой другой модуль, вам нужно будет импортировать):

{month: index for index, month in enumerate(calendar.month_abbr) if month}

В версиях Python до 2.7 из-за того, что синтаксис понимания dict не поддерживается языком, вам нужно будет выполнить

dict((month, index) for index, month in enumerate(calendar.month_abbr) if month)

77

Просто для развлечения:

from time import strptime

strptime('Feb','%b').tm_mon

3
это зависит от вашего региона?
Janus Troelsen

Python 2.7 | ValueError: данные времени «Fev» не соответствуют формату «% b»
Диего Виниций,

@ DiegoVinícius уверен, что "Fev" там должно быть "Feb".
Фавваз Юсран,

@FawwazYusran Diego пробовал язык локали, но команда работает только для названий месяцев на английском языке
PythoNic

1
Это ужасно неэффективно, если использовать его в цикле.
Мистер Лэнс Э. Слоан,

55

Используя модуль календаря :

Number-to-Abbr calendar.month_abbr[month_number]

Abbr-to-Number list(calendar.month_abbr).index(month_abbr)


пример: list (calendar.month_abbr) .index ('Feb') результат: 2
kibitzforu

Для полного названия месяца используйте:list(calendar.month_name).index('January')
Paul

1
Неплохо, но не очень эффективно, если использовать в цикле для поиска многих названий месяцев.
Мистер Лэнс Э. Слоан,

22

Вот еще один способ сделать это.

monthToNum(shortMonth):

    return {
            'jan' : 1,
            'feb' : 2,
            'mar' : 3,
            'apr' : 4,
            'may' : 5,
            'jun' : 6,
            'jul' : 7,
            'aug' : 8,
            'sep' : 9, 
            'oct' : 10,
            'nov' : 11,
            'dec' : 12
    }[shortMonth]

вы можете сделать то же самое следующим образом:, month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))а затемmonth_cal[shortMonth]
Мэтт У.

3
Это хороший способ. Предлагаемый мной способ не требует инструкции импорта. Это вопрос предпочтений.
Gi0rgi0s

20

Источник информации: Python Docs

Чтобы получить номер месяца из названия месяца, используйте модуль datetime

import datetime
month_number = datetime.datetime.strptime(month_name, '%b').month

# To  get month name
In [2]: datetime.datetime.strftime(datetime.datetime.now(), '%a %b %d, %Y')
Out [2]: 'Thu Aug 10, 2017'

# To get just the month name, %b gives abbrevated form, %B gives full month name
# %b => Jan
# %B => January
dateteime.datetime.strftime(datetime_object, '%b')

15

Вот более полный метод, который также может принимать полные названия месяцев.

def month_string_to_number(string):
    m = {
        'jan': 1,
        'feb': 2,
        'mar': 3,
        'apr':4,
         'may':5,
         'jun':6,
         'jul':7,
         'aug':8,
         'sep':9,
         'oct':10,
         'nov':11,
         'dec':12
        }
    s = string.strip()[:3].lower()

    try:
        out = m[s]
        return out
    except:
        raise ValueError('Not a month')

пример:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10

Этот лучше, чем мой выше
Gi0rgi0s


0

Основываясь на идеях, изложенных выше, это эффективно для изменения названия месяца на соответствующий номер месяца:

from time import strptime
monthWord = 'september'

newWord = monthWord [0].upper() + monthWord [1:3].lower() 
# converted to "Sep"

print(strptime(newWord,'%b').tm_mon) 
# "Sep" converted to "9" by strptime

Возможно, я неправильно понял, что вы собираетесь делать, но уверены ли вы, что это не должно быть слово [0: 3]?
pseudoku

Нет, если вы посмотрите еще раз, то увидите, что первая буква word [0] используется в верхнем регистре и соединяется со следующими двумя буквами, word [1: 3]. Код, который я опубликовал, действительно отлично работает при преобразовании слов месяца в соответствующий номер месяца.
thescoop

0

Чтобы получить полное название календаря из номера месяца, вы можете использовать calendar.month_name. См. Дополнительную информацию в документации: https://docs.python.org/2/library/calendar.html

month_no = 1
month = calendar.month_name[month_no]

# month provides "January":
print(month)




-1

Вы можете использовать ниже как альтернативу.

  1. Номер месяца к месяцу:

from time import strptime

strptime('Feb','%b').tm_mon

  1. Номер месяца к месяцу:

import calendar

calendar.month_abbr[2] или calendar.month[2]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.