python'da ay adından ay numarasına ve tam tersi


96

Bir ay numarasını kısaltılmış bir ay adına veya kısaltılmış bir ay adını bir ay sayısına dönüştürebilen bir işlev oluşturmaya çalışıyorum. Bunun yaygın bir soru olabileceğini düşündüm ama internette bulamadım.

Takvim modülünü düşünüyordum . Görüyorum ki ay numarasından kısaltılmış ay ismine çevirmek için sadece yapabilirsiniz calendar.month_abbr[num]. Yine de diğer yöne gitmenin bir yolunu görmüyorum. Bunun üstesinden gelmenin en iyi yolu diğer yöne çevirmek için bir sözlük oluşturmak mıydı? Ya da ay adından ay numarasına ve tam tersine gitmenin daha iyi bir yolu var mı?

Yanıtlar:


98

calendarModülü kullanarak tersine bir sözlük oluşturun (bu, herhangi bir modül gibi, içe aktarmanız gerekecektir):

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

2.7'den önceki Python sürümlerinde, dikte anlama sözdiziminin dilde desteklenmemesi nedeniyle yapmanız gereken

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

77

Sadece eğlence için:

from time import strptime

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

3
bu yerel ayarınıza bağlı mı?
Janus Troelsen

Python 2.7 | ValueError: 'Fev' zaman verisi '% b' biçimiyle eşleşmiyor
Diego Vinícius

@ DiegoVinícius oldukça emin 'Fev' orada 'Feb' olması gerekiyordu.
Fawwaz Yusran

@FawwazYusran Diego yerel dili denedi, ancak komut yalnızca İngilizce ay isimleri için çalışıyor
PythoNic

1
Bir döngüde kullanılırsa bu çok verimsizdir.
Bay Lance E Sloan

55

Takvim modülünü kullanma :

Kısaltılacak Sayı calendar.month_abbr[month_number]

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


örnek: list (calendar.month_abbr) .index ('Şub') sonuç: 2
kibitzforu

Tam ay adı kullanımı için:list(calendar.month_name).index('January')
Paul

1
Fena değil, ancak birçok ay adını aramak için bir döngüde kullanılırsa çok verimli değil.
Bay Lance E Sloan

22

İşte bunu yapmanın başka bir yolu.

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]

: Aynı şeyi bu şekilde yapabiliriz month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))sonra vemonth_cal[shortMonth]
Matt W.

3
Bu iyi bir yol. Benim önerdiğim şekilde bir ithalat beyanı gerekmiyor. Bu bir tercih meselesi.
Gi0rgi0s

20

Bilgi kaynağı: Python Docs

Ay adından ay numarasını almak için datetime modülünü kullanın

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

15

İşte tam ay adlarını da kabul edebilen daha kapsamlı bir yöntem

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

misal:

>>> month_string_to_number("October")
10 
>>> month_string_to_number("oct")
10

Bu, yukarıdaki benimkinden daha iyi
Gi0rgi0s

8

Bir tane daha:

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

0

Yukarıda ifade edilen fikirlere dayanarak, Bu, bir ay adını uygun ay numarasıyla değiştirmek için etkilidir:

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

Belki neyi amaçladığını yanlış okuyorum, ama [0: 3] kelimesi olmaması gerektiğinden emin misin?
pseudoku

Hayır, tekrar bakarsanız, ilk harf olan [0] 'ın büyük harfle kullanıldığını ve sonraki iki harfle, yani [1: 3] ile birleştirildiğini göreceksiniz. Gönderdiğim kod, ay kelimelerini uygun ay numaralarına dönüştürmede gerçekten iyi çalışıyor.
thescoop


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


-1

Aşağıdakileri alternatif olarak kullanabilirsiniz.

  1. Aydan aya sayı:

from time import strptime

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

  1. Ay sayısı - ay:

import calendar

calendar.month_abbr[2] veya calendar.month[2]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.