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?

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

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

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)


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]

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

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

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

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

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

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)

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]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.