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?

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

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

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)


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]

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

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

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

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

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

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)

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]

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.