nom du mois au numéro du mois et vice versa en python

93

J'essaie de créer une fonction qui peut convertir un numéro de mois en un nom de mois abrégé ou un nom de mois abrégé en un numéro de mois. Je pensais que c'était peut-être une question courante, mais je ne l'ai pas trouvée en ligne.

Je pensais au module calendrier . Je vois que pour convertir le numéro du mois en nom de mois abrégé, vous pouvez simplement le faire calendar.month_abbr[num]. Je ne vois cependant pas comment aller dans l'autre sens. La création d'un dictionnaire pour convertir l'autre sens serait-elle la meilleure façon de gérer cela? Ou y a-t-il une meilleure façon de passer du nom du mois au numéro du mois et vice versa?

Mark_Masoul
la source

Réponses:

95

Créez un dictionnaire inversé à l'aide du calendarmodule:

import calendar

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

Avant Python (2.7+), vous feriez

dict((v,k) for k,v in enumerate(calendar.month_abbr))
David Z
la source
cela ne fonctionne pas pour moi pour une raison quelconque, >>> d = dict (v, k pour k, v dans calendar.month_abbr) Fichier "<stdin>", ligne 1 SyntaxError: L'expression du générateur doit être entre parenthèses sinon le seul argument
Mark_Masoul
1
Hmmm, j'ai fait ça et ça a marché ... d = dict ((v, k) for k, v in enumerate (calendar.month_abbr))
Mark_Masoul
@Mark_Masoul: Quelle version de Python? Ça a l'air assez vieux.
S.Lott
calendar.month_abbr n'est pas un dictionnaire, c'est un <calendar._localized_month instance at 0x0164C9E0>. La version originale du code de David a produit des erreurs de syntaxe dans 2.6 et 3.1 - les deux ont besoin de ()v, k et les deux ont besoin d'énumérer pour calendar.month_abbr, ce que j'ai corrigé.
Wayne Werner
Corrigé. J'aurais dû lire la documentation plus attentivement, j'ai manqué que calendar.month_abbrc'était un tableau au lieu d'un dictionnaire.
David Z
77

Juste pour le fun:

from time import strptime

strptime('Feb','%b').tm_mon
Mark Bailey
la source
3
cela dépend-il de votre région?
Janus Troelsen
Python 2.7 | ValueError: les données de temps 'Fev' ne correspondent pas au format '% b'
Diego Vinícius
@ DiegoVinícius à peu près sûr que 'Fev' est censé être 'Feb' là-bas.
Fawwaz Yusran
@FawwazYusran Diego a essayé la langue locale, mais la commande fonctionne uniquement pour les noms de mois en anglais
PythoNic
53

Utilisation du module de calendrier :

Nombre à abbr calendar.month_abbr[month_number]

Abbr-to-Number list(calendar.month_abbr).index(month_abbr)

diogobernardino
la source
exemple: list (calendar.month_abbr) .index ('Feb') résultat: 2
kibitzforu
Pour utiliser le nom complet du mois:list(calendar.month_name).index('January')
Paul
23

Voici encore une autre façon de le faire.

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
la source
vous pouvez faire la même chose de cette façon:, month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))et puismonth_cal[shortMonth]
Matt W.
3
C'est un bon moyen. La manière que j'ai suggérée n'a pas besoin d'une déclaration d'importation. C'est une question de préférence.
Gi0rgi0s
20

Source d'informations: Python Docs

Pour obtenir le numéro du mois à partir du nom du mois, utilisez le module 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
la source
16

Voici une méthode plus complète qui peut également accepter les noms de mois complets

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

exemple:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10
harryh
la source
Celui-ci est meilleur que le mien ci
Gi0rgi0s
9

Un de plus:

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

Pour obtenir le nom du mois à l'aide du numéro du mois, vous pouvez utiliser time:

import time

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

'November'

Et pour obtenir le numéro du mois en utilisant le nom du mois:

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

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

S'appuyant sur les idées exprimées ci-dessus, ceci est efficace pour changer le nom d'un mois en son numéro de mois approprié:

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
le scoop
la source
Peut-être ai-je mal interprété ce que vous recherchez, mais êtes-vous sûr que cela ne devrait pas être le mot [0: 3]?
pseudoku
Non, si vous regardez à nouveau, vous verrez que le premier mot [0] est utilisé en majuscules et concaténé aux deux lettres suivantes, le mot [1: 3]. Le code que j'ai publié fonctionne très bien pour convertir les mots du mois en leur numéro de mois approprié.
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
la source
Expliquer votre codage est toujours meilleur
Badro Niaimi
0

Vous pouvez utiliser ci-dessous comme alternative.

  1. Numéro de mois en mois:

from time import strptime

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

  1. Numéro de mois en mois:

import calendar

calendar.month_abbr[2] ou calendar.month[2]

Yogesh
la source