2010-08-05 21 views
48

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

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

Respuesta

47

Creación de un diccionario inverso sería una forma razonable de hacer esto, porque es bastante simple:

import calendar 
dict((v,k) for k,v in enumerate(calendar.month_abbr)) 

o en versiones recientes de Python (2.7+), que apoyan la comprensión diccionario:

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

esto no es trabajo para mí por alguna razón, >>> d = dict (v, k para k, v en calendar.month_abbr) Archivo "", línea 1 SyntaxError : La expresión del generador debe estar entre paréntesis si no es el único argumento –

+1

Hmmm, lo hice y funcionó ... d = dict ((v, k) para k, v en enumerate (calendar.month_abbr)) –

+0

@Mark_Masoul: ¿Qué versión de ¿Pitón? Parece bastante viejo. –

51

Simplemente por diversión:

from time import strptime 

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

¿esto depende de su configuración regional? –

+0

Está funcionando en mi caso gracias –

11

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

Usando calendar módulo:

Número-a-Abr calendar.month_abbr[month_number]

Abr-a-Número list(calendar.month_abbr).index(month_abbr)

5

Uno más:

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

Su e es un método más amplio que también puede aceptar nombres completos mes

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 
0

Para obtener el nombre del mes usando el número de meses, puede utilizar time:

import time 

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

'November' 
3

Información fuente: Python Docs

obtener el número de mes fro m nombre del mes utilización del 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') 
Cuestiones relacionadas