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

96

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

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

Mark_Masoul
источник

Ответы:

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]
Gi0rgi0s
источник
вы можете сделать то же самое следующим образом:, 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')
theBuzzyCoder
источник
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
8

Еще один:

def month_converter(month):
    months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    return months.index(month) + 1
Александр Александров
источник
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
form month name to number
d=['JAN','FEB','MAR','April','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']
N=input()
for i in range(len(d)):
    if d[i] == N:
        month=(i+1)
print(month)
user12643768
источник
Всегда лучше
объяснять код,
-1

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

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

from time import strptime

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

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

import calendar

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

Йогеш
источник