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?

Mark_Masoul
sumber

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)
David Z
sumber
77

Hanya untuk bersenang-senang:

from time import strptime

strptime('Feb','%b').tm_mon
Mark Bailey
sumber
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)

diogobernardino.dll
sumber
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]
Gi0rgi0s
sumber
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')
theBuzzyCoder
sumber
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
harryh
sumber
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
Aleksandr Aleksandrov
sumber
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
kandang
sumber
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
0

Untuk mendapatkan nama kalender lengkap dari nomor bulan, Anda dapat menggunakan calendar.month_name. Silakan lihat dokumentasi untuk lebih jelasnya: https://docs.python.org/2/library/calendar.html

month_no = 1
month = calendar.month_name[month_no]

# month provides "January":
print(month)


Sian Thompson
sumber
-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)
pengguna12643768
sumber
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]

Yogesh
sumber