ชื่อเดือนเป็นหมายเลขเดือนและในทางกลับกันใน python


96

ฉันกำลังพยายามสร้างฟังก์ชันที่สามารถแปลงเลขเดือนเป็นชื่อเดือนแบบย่อหรือชื่อเดือนแบบย่อเป็นเลขเดือนได้ ฉันคิดว่านี่อาจเป็นคำถามที่พบบ่อย แต่หาไม่พบทางออนไลน์

ฉันกำลังคิดเกี่ยวกับโมดูลปฏิทิน calendar.month_abbr[num]ผมเห็นว่าการแปลงจากตัวเลขเดือนชื่อเดือนย่อคุณก็สามารถทำได้ ฉันไม่เห็นทางที่จะไปทางอื่นแม้ว่า การสร้างพจนานุกรมสำหรับแปลงทิศทางอื่นจะเป็นวิธีที่ดีที่สุดในการจัดการสิ่งนี้หรือไม่? หรือมีวิธีที่ดีกว่าในการเปลี่ยนจากชื่อเดือนเป็นหมายเลขเดือนและในทางกลับกัน?

คำตอบ:


98

สร้างพจนานุกรมย้อนกลับโดยใช้calendarโมดูล (ซึ่งคุณจะต้องนำเข้าเช่นเดียวกับโมดูลใด ๆ ):

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

ใน Python เวอร์ชันก่อน 2.7 เนื่องจากภาษาไม่รองรับการเขียนตามความเข้าใจไวยากรณ์คุณจะต้องทำ

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

77

แค่เล่น ๆ:

from time import strptime

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

3
สิ่งนี้ขึ้นอยู่กับสถานที่ของคุณหรือไม่
Janus Troelsen

Python 2.7 | ValueError: ข้อมูลเวลา 'Fev' ไม่ตรงกับรูปแบบ '% b'
Diego Vinícius

@ DiegoViníciusค่อนข้างแน่ใจว่า 'Fev' ควรจะเป็น 'ก.พ. ' ที่นั่น
Fawwaz Yusran

@FawwazYusran Diego พยายามใช้ภาษาโลแคล แต่คำสั่งใช้งานได้กับชื่อเดือนภาษาอังกฤษเท่านั้น
PythoNic

1
สิ่งนี้ไม่มีประสิทธิภาพอย่างมากหากใช้ในการวนซ้ำ
Mr. Lance E Sloan

55

การใช้โมดูลปฏิทิน :

Number-to-Abbr calendar.month_abbr[month_number]

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


ตัวอย่าง: list (calendar.month_abbr) .index ('Feb') ผลลัพธ์: 2
kibitzforu

สำหรับการใช้ชื่อเดือนเต็ม:list(calendar.month_name).index('January')
พอล

1
ไม่เลว แต่ก็ไม่ได้มีประสิทธิภาพมากนักหากใช้ในการวนซ้ำเพื่อค้นหาชื่อหลายเดือน
Mr. Lance E Sloan

22

นี่เป็นอีกวิธีหนึ่งที่จะทำได้

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]

คุณสามารถทำสิ่งเดียวกันนี้ได้: month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13)))แล้วmonth_cal[shortMonth]
Matt W.

3
นั่นเป็นวิธีที่ดี วิธีที่ฉันแนะนำไม่จำเป็นต้องมีใบแจ้งยอดการนำเข้า มันเป็นเรื่องของความชอบ
Gi0rgi0s

20

แหล่งข้อมูล: Python Docs

หากต้องการรับหมายเลขเดือนจากชื่อเดือนให้ใช้โมดูลวันที่และเวลา

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

นี่คือวิธีการที่ครอบคลุมมากขึ้นซึ่งสามารถยอมรับชื่อเต็มเดือนได้

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

ตัวอย่าง:

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

อันนี้ดีกว่าของฉันข้างบน
Gi0rgi0s


0

จากแนวคิดที่แสดงไว้ข้างต้นสิ่งนี้มีผลสำหรับการเปลี่ยนชื่อเดือนเป็นหมายเลขเดือนที่เหมาะสม:

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

บางทีฉันอาจจะเข้าใจผิดว่าคุณกำลังจะทำอะไร แต่คุณแน่ใจหรือว่ามันไม่ควรเป็นคำว่า [0: 3]
pseudoku

ไม่ถ้าคุณมองอีกครั้งคุณจะเห็นว่าคำอักษรตัวแรก [0] ถูกใช้เป็นตัวพิมพ์ใหญ่และเชื่อมต่อกับตัวอักษรสองตัวถัดไป word [1: 3] รหัสที่ฉันโพสต์ใช้งานได้ดีมากในการแปลงคำเดือนเป็นหมายเลขเดือนที่เหมาะสม
thescoop

0

หากต้องการรับชื่อปฏิทินแบบเต็มจากหมายเลขเดือนคุณสามารถใช้ calendar.month_name โปรดดูเอกสารสำหรับรายละเอียดเพิ่มเติม: https://docs.python.org/2/library/calendar.html

month_no = 1
month = calendar.month_name[month_no]

# month provides "January":
print(month)



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

การอธิบายการเข้ารหัสของคุณดีกว่าเสมอ
Badro Niaimi

-1

คุณสามารถใช้ด้านล่างเป็นทางเลือกอื่น

  1. เดือนต่อเดือน:

from time import strptime

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

  1. เลขเดือนต่อเดือน:

import calendar

calendar.month_abbr[2] หรือ calendar.month[2]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.