nome do mês para o número do mês e vice-versa em python

93

Estou tentando criar uma função que pode converter um número de mês em um nome de mês abreviado ou um nome de mês abreviado em um número de mês. Achei que essa fosse uma pergunta comum, mas não consegui encontrar online.

Estava pensando no módulo do calendário . Vejo que para converter do número do mês para o nome do mês abreviado, você pode simplesmente fazer calendar.month_abbr[num]. Não vejo uma maneira de ir na outra direção, entretanto. Criar um dicionário para converter na outra direção seria a melhor maneira de lidar com isso? Ou existe uma maneira melhor de ir do nome do mês para o número do mês e vice-versa?

Mark_Masoul
fonte

Respostas:

95

Crie um dicionário reverso usando o calendarmódulo:

import calendar

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

Antes do Python (2.7+), você faria

dict((v,k) for k,v in enumerate(calendar.month_abbr))
David Z
fonte
isso não está funcionando para mim por algum motivo, >>> d = dict (v, k para k, v em calendar.month_abbr) Arquivo "<stdin>", linha 1 SyntaxError: A expressão
geradora
1
Hmmm, eu fiz isso e funcionou ... d = dict ((v, k) para k, v in enumerate (calendar.month_abbr))
Mark_Masoul
@Mark_Masoul: Qual versão do Python? Parece muito velho.
S.Lott
calendar.month_abbr não é um dicionário, é um <calendar._localized_month instance at 0x0164C9E0>. A versão original do código de David produziu erros de sintaxe em 2.6 e 3.1 - ambos precisam em ()torno de v, k e ambos precisam enumerar para calendar.month_abbr, que corrigi.
Wayne Werner
Corrigido. Eu deveria ter lido a documentação com mais atenção, pois perdi que calendar.month_abbrera um array em vez de um dicionário.
David Z
77

Apenas por diversão:

from time import strptime

strptime('Feb','%b').tm_mon
Mark Bailey
fonte
3
isso depende da sua localidade?
Janus Troelsen de
Python 2.7 | ValueError: dados de tempo 'Fev' não correspondem ao formato '% b'
Diego Vinícius
@ DiegoVinícius tenho certeza que 'Fev' deve ser 'fevereiro' lá.
Fawwaz Yusran
@FawwazYusran Diego tentou o idioma local, mas o comando está funcionando apenas para nomes de meses em inglês
PythoNic
53

Usando o módulo de calendário :

Número para Abbr calendar.month_abbr[month_number]

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

diogobernardino
fonte
exemplo: list (calendar.month_abbr) .index ('fevereiro') resultado: 2
kibitzforu
Para usar o nome do mês completo:list(calendar.month_name).index('January')
Paul
23

Aqui está outra maneira de fazer isso.

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
fonte
você pode fazer a mesma coisa desta forma:, month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))e entãomonth_cal[shortMonth]
Matt W.
3
Essa é uma boa maneira. A maneira que sugeri não precisa de uma declaração de importação. É uma questão de preferência.
Gi0rgi0s
20

Fonte de informação: Python Docs

Para obter o número do mês a partir do nome do mês, use o módulo 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
fonte
16

Aqui está um método mais abrangente que também pode aceitar nomes 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')

exemplo:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10
harryh
fonte
Este é melhor do que o meu acima
Gi0rgi0s
9

Mais um:

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

Para obter o nome do mês usando o número do mês, você pode usar time:

import time

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

'November'

E para obter o número do mês usando o nome do mês:

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

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

Com base nas ideias expressas acima, isso é eficaz para alterar o nome de um mês para o número do mês apropriado:

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
thescoop
fonte
Talvez eu esteja interpretando mal o que você quer, mas tem certeza de que não deveria ser palavra [0: 3]?
pseudoku
Não, se você olhar novamente, verá que a primeira letra da palavra [0] é usada em maiúsculas e concatenada com as próximas duas letras, palavra [1: 3]. O código que postei funciona muito bem na conversão de palavras do mês em seu número de mês apropriado.
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
fonte
Explicar sua codificação é sempre melhor
Badro Niaimi
0

Você pode usar a seguir como alternativa.

  1. Número mês a mês:

from time import strptime

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

  1. Número do mês a mês:

import calendar

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

Yogesh
fonte