назва місяця до номера місяця і навпаки в python


95

Я намагаюся створити функцію, яка може перетворити номер місяця на скорочене ім'я місяця або скорочене ім'я місяця на номер місяця. Я думав, що це може бути поширене запитання, але я не зміг знайти його в Інтернеті.

Я думав про календарний модуль. Я бачу, що перетворити номер місяця на скорочену назву місяця ви можете просто calendar.month_abbr[num]. Але я не бачу способу піти в інший бік. Чи найкращим способом впоратись із цим словником для перетворення іншого напрямку? Або є кращий спосіб перейти від назви місяця до номера місяця і навпаки?

Відповіді:


97

Створіть зворотний словник, використовуючи 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)

76

Задля розваги:

from time import strptime

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

3
це залежить від вашої мови?
Янус Трольсен

Python 2.7 | ValueError: часові дані 'Fev' не відповідають формату '% b'
Дієго Вініцій

@ DiegoVinícius майже впевнений, що там має бути "Fev".
Fawwaz Yusran

@FawwazYusran Дієго спробував мову мови, але команда працює лише для імен місяців англійською мовою
PythoNic

Це надзвичайно неефективно, якщо використовувати в циклі.
Містер Ленс Е Слоун,

55

Використання модуля календаря :

Кількість до абревіатури calendar.month_abbr[month_number]

Скорочено до числа list(calendar.month_abbr).index(month_abbr)


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

Для повного використання імені місяця:list(calendar.month_name).index('January')
Павло,

Непогано, але не дуже ефективно, якщо використовувати його в циклі для пошуку багатьох імен місяців.
Містер Ленс Е Слоун,

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]
Matt W.

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]?
псевдоку

Ні, якщо ви ще раз подивитесь, то побачите, що слово з першої літери [0] використовується з великої літери та об’єднується з наступними двома буквами, словом [1: 3]. Код, який я опублікував, працює дуже добре, перетворюючи слова місяця на відповідні номери місяців.
thescoop

0

Щоб отримати повну назву календаря з номера місяця, ви можете скористатися календарем.місяця_назву. Будь ласка, перегляньте документацію для отримання додаткової інформації: 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.