nazwa miesiąca na numer miesiąca i odwrotnie w Pythonie

96

Próbuję utworzyć funkcję, która może przekształcić numer miesiąca w skróconą nazwę miesiąca lub skróconą nazwę miesiąca na numer miesiąca. Myślałem, że to częste pytanie, ale nie mogłem go znaleźć w Internecie.

Myślałem o module kalendarza . Widzę, że aby przekonwertować numer miesiąca na skróconą nazwę miesiąca, możesz po prostu zrobić calendar.month_abbr[num]. Nie widzę jednak sposobu, aby pójść w innym kierunku. Czy stworzenie słownika do konwersji drugiego kierunku byłoby najlepszym sposobem na rozwiązanie tego problemu? A może jest lepszy sposób na przejście od nazwy miesiąca do numeru miesiąca i odwrotnie?

Mark_Masoul
źródło

Odpowiedzi:

98

Utwórz słownik zwrotny za pomocą calendarmodułu (który, jak każdy moduł, musisz zaimportować):

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

W wersjach Pythona starszych niż 2.7, z powodu braku obsługi składni Dict w języku, musiałbyś zrobić

dict((month, index) for index, month in enumerate(calendar.month_abbr) if month)
David Z
źródło
77

Dla żartu:

from time import strptime

strptime('Feb','%b').tm_mon
Mark Bailey
źródło
3
czy to zależy od twojego regionu?
Janus Troelsen
Python 2.7 | ValueError: data „Fev” nie pasuje do formatu „% b”
Diego Vinícius
@ Diego Vinícius jest prawie pewien, że „Fev” ma być tam „Feb”.
Fawwaz Yusran
@FawwazYusran Diego wypróbował język lokalny, ale polecenie działa tylko dla nazw miesięcy w języku angielskim
PythoNic
1
Jest to strasznie nieefektywne, jeśli jest używane w pętli.
Mr. Lance E Sloan
55

Korzystanie z modułu kalendarza :

Numer-do-skrótu calendar.month_abbr[month_number]

Skrót do numeru list(calendar.month_abbr).index(month_abbr)

diogobernardino
źródło
przykład: list (calendar.month_abbr) .index ('luty') wynik: 2
kibitzforu
Dla nazwy pełnego miesiąca:list(calendar.month_name).index('January')
Paul
1
Nieźle, ale niezbyt wydajne, jeśli jest używane w pętli do wyszukiwania nazw wielu miesięcy.
Mr. Lance E Sloan
22

Oto kolejny sposób, aby to zrobić.

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
źródło
możesz zrobić to samo w ten sposób month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))month_cal[shortMonth]
Matt W.
3
To dobry sposób. Sposób, w jaki zasugerowałem, nie wymaga instrukcji importu. To kwestia preferencji.
Gi0rgi0s
20

Źródło informacji: Python Docs

Aby uzyskać numer miesiąca z nazwy miesiąca, użyj modułu 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
źródło
15

Oto bardziej wszechstronna metoda, która może również akceptować pełne nazwy miesięcy

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')

przykład:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10
Harry
źródło
Ten jest lepszy niż mój powyżej
Gi0rgi0s
8

Jeszcze jeden:

def month_converter(month):
    months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    return months.index(month) + 1
Aleksandr Aleksandrov
źródło
0

Opierając się na pomysłach przedstawionych powyżej, jest to skuteczne w przypadku zmiany nazwy miesiąca na odpowiedni numer miesiąca:

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
szufelka
źródło
Może źle czytam, do czego zmierzasz, ale czy na pewno nie powinno to być słowo [0: 3]?
pseudoku
Nie, jeśli spojrzysz ponownie, zobaczysz, że pierwsza litera słowo [0] jest pisane wielkimi literami i połączone z następnymi dwiema literami, słowem [1: 3]. Kod, który opublikowałem, działa naprawdę dobrze w zamianie słów miesiąca na ich odpowiedni numer miesiąca.
thescoop
0

Aby uzyskać pełną nazwę kalendarza na podstawie numeru miesiąca, możesz użyć pliku calendar.month_name. Więcej informacji można znaleźć w dokumentacji: https://docs.python.org/2/library/calendar.html

month_no = 1
month = calendar.month_name[month_no]

# month provides "January":
print(month)


Sian Thompson
źródło
-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
źródło
Wyjaśnienie swojego kodowania jest zawsze lepsze
Badro Niaimi
-1

Możesz użyć poniżej jako alternatywy.

  1. Numer z miesiąca na miesiąc:

from time import strptime

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

  1. Numer miesiąca do miesiąca:

import calendar

calendar.month_abbr[2] lub calendar.month[2]

Yogesh
źródło