nombre del mes al número del mes y viceversa en Python

96

Estoy tratando de crear una función que pueda convertir un número de mes en un nombre de mes abreviado o un nombre de mes abreviado en un número de mes. Pensé que esta podría ser una pregunta común, pero no pude encontrarla en línea.

Estaba pensando en el módulo de calendario . Veo que para convertir de número de mes a nombre de mes abreviado, puede hacerlo calendar.month_abbr[num]. Sin embargo, no veo la manera de ir en la otra dirección. ¿Crear un diccionario para convertir la otra dirección sería la mejor manera de manejar esto? ¿O hay una mejor manera de pasar del nombre del mes al número del mes y viceversa?

Mark_Masoul
fuente

Respuestas:

98

Cree un diccionario inverso usando el calendarmódulo (que, como cualquier módulo, deberá importar):

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

En las versiones de Python anteriores a la 2.7, debido a que la sintaxis de comprensión de dictados no es compatible con el lenguaje, tendría que hacer

dict((month, index) for index, month in enumerate(calendar.month_abbr) if month)
David Z
fuente
77

Solo por diversión:

from time import strptime

strptime('Feb','%b').tm_mon
Mark Bailey
fuente
3
¿Depende esto de tu localidad?
Janus Troelsen
Python 2.7 | ValueError: los datos de tiempo 'Fev' no coinciden con el formato '% b'
Diego Vinícius
@ DiegoVinícius está bastante seguro de que se supone que 'Fev' es 'Feb' allí.
Fawwaz Yusran
@FawwazYusran Diego probó el idioma local, pero el comando funciona solo para los nombres de los meses en inglés
PythoNic
1
Esto es terriblemente ineficaz si se usa en un bucle.
Sr. Lance E Sloan
55

Usando el módulo de calendario :

Número a abreviar calendar.month_abbr[month_number]

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

diogobernardino
fuente
ejemplo: list (calendar.month_abbr) .index ('Feb') resultado: 2
kibitzforu
Para usar el nombre del mes completo:list(calendar.month_name).index('January')
Paul
1
No está mal, pero no es terriblemente eficiente si se usa en un bucle para buscar muchos nombres de meses.
Sr. Lance E Sloan
22

Aquí hay otra forma de hacerlo.

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
fuente
puede hacer lo mismo de esta manera:, month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))y luegomonth_cal[shortMonth]
Matt W.
3
Esa es una buena forma. La forma en que sugerí no necesita una declaración de importación. Es una cuestión de preferencia.
Gi0rgi0s
20

Fuente de información: Python Docs

Para obtener el número de mes del nombre del mes, use el módulo de fecha y hora

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

Aquí hay un método más completo que también puede aceptar nombres de meses completos

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

ejemplo:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10
Harry
fuente
Este es mejor que el mío anterior
Gi0rgi0s
8

Uno mas:

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

Sobre la base de las ideas expresadas anteriormente, esto es efectivo para cambiar el nombre de un mes a su número de mes apropiado:

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
la primicia
fuente
Tal vez esté malinterpretando lo que estás buscando, pero ¿estás seguro de que no debería ser una palabra [0: 3]?
pseudoku
No, si vuelve a mirar, verá que la primera letra de la palabra [0] se usa en mayúsculas y está concatenada con las siguientes dos letras, palabra [1: 3]. El código que publiqué funciona muy bien para convertir palabras de mes a su número de mes apropiado.
thescoop
0

Para obtener el nombre completo del calendario a partir del número de mes, puede usar calendar.month_name. Consulte la documentación para obtener más detalles: https://docs.python.org/2/library/calendar.html

month_no = 1
month = calendar.month_name[month_no]

# month provides "January":
print(month)


Sian Thompson
fuente
-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)
usuario12643768
fuente
Explicar tu codificación siempre es mejor
Badro Niaimi
-1

Puede utilizar a continuación como alternativa.

  1. Número de mes a mes:

from time import strptime

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

  1. Número de mes a mes:

import calendar

calendar.month_abbr[2] o calendar.month[2]

Yogesh
fuente