nama bulan ke nomor bulan dan sebaliknya dengan python


96

Saya mencoba membuat fungsi yang dapat mengubah nomor bulan menjadi nama bulan yang disingkat atau nama bulan yang disingkat menjadi nomor bulan. Saya pikir ini mungkin pertanyaan umum tetapi saya tidak dapat menemukannya secara online.

Saya sedang berpikir tentang modul kalender . Saya melihat bahwa untuk mengubah dari nomor bulan menjadi nama bulan yang disingkat, Anda bisa melakukannya calendar.month_abbr[num]. Saya tidak melihat cara untuk pergi ke arah lain. Akankah membuat kamus untuk mengubah arah lain menjadi cara terbaik untuk menangani ini? Atau adakah cara yang lebih baik untuk beralih dari nama bulan ke nomor bulan dan sebaliknya?

Jawaban:


98

Buat kamus terbalik menggunakan calendarmodul (yang, seperti modul lainnya, Anda perlu mengimpor):

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

Dalam versi Python sebelum 2.7, karena sintaks pemahaman dict tidak didukung dalam bahasa, Anda harus melakukannya

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

77

Hanya untuk bersenang-senang:

from time import strptime

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

3
apakah ini tergantung pada lokal Anda?
Janus Troelsen

Python 2.7 | ValueError: data waktu 'Fev' tidak cocok dengan format '% b'
Diego Vinícius

Diego cukup yakin 'F' seharusnya menjadi 'Feb' di sana.
Fawwaz Yusran

@FawwazYusran Diego mencoba bahasa lokal, tetapi perintahnya hanya berfungsi untuk nama bulan bahasa Inggris
PythoNic

1
Ini sangat tidak efisien jika digunakan dalam satu putaran.
Tn. Lance E Sloan

55

Menggunakan modul kalender :

Nomor-ke-Abbr calendar.month_abbr[month_number]

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


contoh: daftar (calendar.month_abbr) .index ('Feb') hasil: 2
kibitzforu

Untuk penggunaan nama bulan penuh:list(calendar.month_name).index('January')
Paul

1
Tidak buruk, tetapi tidak terlalu efisien jika digunakan dalam satu lingkaran untuk mencari banyak nama bulan.
Tn. Lance E Sloan

22

Berikut cara lain untuk melakukannya.

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]

Anda dapat melakukan hal yang sama dengan cara ini month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))month_cal[shortMonth]
Matt W.

3
Itu cara yang bagus. Cara saya menyarankan tidak memerlukan pernyataan impor. Ini masalah preferensi.
Gi0rgi0s

20

Sumber informasi: Python Docs

Untuk mendapatkan nomor bulan dari nama bulan gunakan modul 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')

15

Berikut adalah metode yang lebih komprehensif yang juga dapat menerima nama satu bulan penuh

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

contoh:

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

Yang ini lebih baik daripada milik saya di atas
Gi0rgi0s

8

Satu lagi:

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

0

Berdasarkan gagasan yang diungkapkan di atas, Ini efektif untuk mengubah nama bulan menjadi nomor bulan yang sesuai:

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

Mungkin saya salah membaca apa yang Anda cari, tetapi apakah Anda yakin itu bukan kata [0: 3]?
pseudoku

Tidak, jika Anda melihat lagi, Anda akan melihat bahwa huruf pertama kata [0] digunakan dalam huruf besar dan digabungkan ke dua huruf berikutnya, kata [1: 3]. Kode yang saya posting bekerja sangat baik dalam mengubah kata bulan menjadi nomor bulan yang sesuai.
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)

Menjelaskan pengkodean Anda selalu lebih baik
Badro Niaimi

-1

Anda dapat menggunakan di bawah ini sebagai alternatif.

  1. Nomor bulan ke bulan:

from time import strptime

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

  1. Nomor bulan ke bulan:

import calendar

calendar.month_abbr[2] atau calendar.month[2]

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.