Monatsname zu Monatsnummer und umgekehrt in Python

91

Ich versuche eine Funktion zu erstellen, die eine Monatsnummer in einen abgekürzten Monatsnamen oder einen abgekürzten Monatsnamen in eine Monatsnummer konvertieren kann. Ich dachte, dies könnte eine häufige Frage sein, konnte sie aber online nicht finden.

Ich habe über das Kalendermodul nachgedacht . Ich sehe, dass Sie einfach von der Monatsnummer in den abgekürzten Monatsnamen konvertieren können calendar.month_abbr[num]. Ich sehe jedoch keinen Weg in die andere Richtung. Wäre das Erstellen eines Wörterbuchs zum Konvertieren der anderen Richtung der beste Weg, um damit umzugehen? Oder gibt es einen besseren Weg, um vom Monatsnamen zur Monatsnummer und umgekehrt zu gelangen?

Mark_Masoul
quelle

Antworten:

93

Erstellen Sie mit dem calendarModul ein umgekehrtes Wörterbuch :

import calendar

{v: k for k,v in enumerate(calendar.month_abbr)}

Vor Python (2.7+) würden Sie tun

dict((v,k) for k,v in enumerate(calendar.month_abbr))
David Z.
quelle
Dies funktioniert aus irgendeinem Grund nicht für mich. >>> d = dict (v, k für k, v in calendar.month_abbr) Datei "<stdin>", Zeile 1 SyntaxError: Der Generatorausdruck muss in Klammern stehen, wenn nicht das einzige Argument
Mark_Masoul
1
Hmmm, ich habe das gemacht und es hat funktioniert ... d = dict ((v, k) für k, v in enumerate (calendar.month_abbr))
Mark_Masoul
@ Mark_Masoul: Welche Version von Python? Sieht ziemlich alt aus.
S.Lott
calendar.month_abbr ist kein Wörterbuch, sondern ein <calendar._localized_month instance at 0x0164C9E0>. Die ursprüngliche Version von Davids Code erzeugte Syntaxfehler in 2.6 und 3.1 - beide benötigen ()ungefähr v, k und beide müssen für calendar.month_abbr auflisten, was ich behoben habe.
Wayne Werner
Behoben. Ich hätte die Dokumentation genauer lesen sollen, ich habe vermisst, dass calendar.month_abbres sich um ein Array anstelle eines Wörterbuchs handelt.
David Z
76

Nur zum Spaß:

from time import strptime

strptime('Feb','%b').tm_mon
Mark Bailey
quelle
3
hängt dies von Ihrem Gebietsschema ab?
Janus Troelsen
Python 2.7 | ValueError: Zeitdaten 'Fev' stimmen nicht mit Format '% b' überein
Diego Vinícius
@ DiegoVinícius ziemlich sicher, dass 'Fev' dort 'Feb' sein soll.
Fawwaz Yusran
@FawwazYusran Diego hat die Sprache des Gebietsschemas ausprobiert, aber der Befehl funktioniert nur für englischsprachige Monatsnamen
PythoNic
50

Verwenden des Kalendermoduls :

Number-to-Abbr calendar.month_abbr[month_number]

Abkürzung zur Nummer list(calendar.month_abbr).index(month_abbr)

diogobernardino
quelle
Beispiel: list (calendar.month_abbr) .index ('Feb') Ergebnis: 2
kibitzforu
23

Hier ist noch eine andere Möglichkeit, dies zu tun.

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
quelle
Sie können das Gleiche auf diese Weise tun: month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))und dannmonth_cal[shortMonth]
Matt W.
3
Das ist ein guter Weg. Die von mir vorgeschlagene Art benötigt keine Importanweisung. Es ist eine Frage der Präferenz.
Gi0rgi0s
20

Informationsquelle: Python Docs

Um die Monatsnummer vom Monatsnamen zu erhalten, verwenden Sie das Datum / Uhrzeit-Modul

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
quelle
15

Hier ist eine umfassendere Methode, die auch vollständige Monatsnamen akzeptieren kann

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

Beispiel:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10
Harryh
quelle
Dieser ist besser als meiner oben
Gi0rgi0s
9

Einer noch:

def month_converter(month):
    months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    return months.index(month) + 1
Aleksandr Aleksandrov
quelle
2

Um den Monatsnamen anhand der Monatsnummer zu erhalten, können Sie Folgendes verwenden time:

import time

mn = 11
print time.strftime('%B', time.struct_time((0, mn, 0,)+(0,)*6)) 

'November'

Und um die Monatsnummer mit dem Monatsnamen zu erhalten:

time.strptime("Nov", "%b").tm_mon
11
# or

time.strptime("November", "%B").tm_mon
11
Kenly
quelle
1

Aufbauend auf den oben genannten Ideen ist dies effektiv, um einen Monatsnamen in die entsprechende Monatsnummer zu ändern:

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
thescoop
quelle
Vielleicht verstehe ich falsch, was Sie wollen, aber sind Sie sicher, dass es kein Wort [0: 3] sein sollte?
Pseudoku
Nein, wenn Sie noch einmal hinschauen, werden Sie feststellen, dass das erste Buchstabenwort [0] in Großbuchstaben verwendet und mit den nächsten beiden Buchstaben, Wort [1: 3], verknüpft wird. Der Code, den ich gepostet habe, funktioniert sehr gut beim Konvertieren von Monatswörtern in die entsprechende Monatszahl.
Thescoop
0
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
quelle
Es ist immer besser, Ihre Codierung zu erklären
Badro Niaimi
0

Sie können unten als Alternative verwenden.

  1. Nummer von Monat zu Monat:

from time import strptime

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

  1. Monatszahl zu Monat:

import calendar

calendar.month_abbr[2] oder calendar.month[2]

Yogesh
quelle