¿Cómo asignar el nombre del mes al número de mes y viceversa?

4 minutos de lectura

avatar de usuario
Mark_Masoul

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.

yo estaba pensando en el calendario módulo. Veo que para convertir de número de mes a nombre de mes abreviado, simplemente puede hacer calendar.month_abbr[num]. Sin embargo, no veo una 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?

avatar de usuario
david z

Cree un diccionario inverso usando el calendar mó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 se admite en el lenguaje, tendría que hacer

dict((month, index) for index, month in enumerate(calendar.month_abbr) if month)

avatar de usuario
marca bailey

Solo por diversión:

from time import strptime

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

  • ¿Esto depende de tu localidad?

    – Janus Troelsen

    10 de noviembre de 2015 a las 10:47

  • Pitón 2.7 | ValueError: los datos de tiempo ‘Fev’ no coinciden con el formato ‘%b’

    – Diego Vinícius

    22 oct 2018 a las 14:22

  • @DiegoVinícius bastante seguro de que se supone que ‘Fev’ es ‘Feb’ allí.

    – Fawwaz Yusran

    5 de marzo de 2020 a las 7:47

  • @FawwazYusran Diego probó el idioma local, pero el comando funciona solo para nombres de meses en inglés

    – PythoNic

    31 de julio de 2020 a las 12:06

  • Esto es terriblemente ineficiente si se usa en un bucle.

    – Sr. Lance E Sloan

    23 de octubre de 2020 a las 1:53

Usando calendario módulo:

Número a abreviatura
calendar.month_abbr[month_number]

Abreviatura a número
list(calendar.month_abbr).index(month_abbr)

  • ejemplo: list(calendar.month_abbr).index(‘Feb’) resultado: 2

    – kibitzforu

    7 de marzo de 2019 a las 16:28

  • Para el uso del nombre del mes completo: list(calendar.month_name).index('January')

    – Pablo

    29 de agosto de 2020 a las 14:58

  • 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 oct 2020 a las 20:51

  • @Mr.LanceESloan, ¿comparaste/verificaste esto? Claro, recargar la lista cada vez es un desperdicio, pero podría almacenarla antes del ciclo, lo que es bastante equivalente a otras respuestas. No estoy seguro del costo/ganancia en el índice en comparación con el uso de diccionarios. Y si desea evitar la sobrecarga del módulo adicional, ¿podría importar solo esta función? ¿Qué respuesta apoyas como eficiente? Tal como está, su comentario no es muy útil para más usuarios novatos como yo que buscan algo eficiente (pero razonablemente sencillo) … ¡¿así que tal vez pueda ayudarnos a señalarnos algún lugar?!

    – Tempestad de peligro

    21 de junio a las 7:37


avatar de usuario
gi0rgi0s

Aquí hay otra manera de hacerlo.

def 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]

Fuente de información: Documentos de Python

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

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

avatar de usuario
hynekcer

Uno mas:

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

¿Ha sido útil esta solución?