tên tháng thành số tháng và ngược lại trong python


95

Tôi đang cố gắng tạo một hàm có thể chuyển đổi số tháng thành tên tháng viết tắt hoặc tên tháng viết tắt thành số tháng. Tôi nghĩ đây có thể là một câu hỏi phổ biến nhưng tôi không thể tìm thấy nó trên mạng.

Tôi đang nghĩ về mô-đun lịch . Tôi thấy rằng để chuyển đổi từ số tháng sang tên tháng viết tắt bạn chỉ cần làm calendar.month_abbr[num]. Tôi không thấy có cách nào để đi theo hướng khác. Việc tạo từ điển để chuyển đổi hướng khác có phải là cách tốt nhất để xử lý điều này không? Hoặc có cách nào tốt hơn để chuyển từ tên tháng sang số tháng và ngược lại?

Câu trả lời:


97

Tạo từ điển đảo ngược bằng cách sử dụng calendarmô-đun (mà, giống như bất kỳ mô-đun nào, bạn sẽ cần nhập):

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

Trong các phiên bản Python trước 2.7, do cú pháp đọc hiểu chính tả không được hỗ trợ trong ngôn ngữ, bạn sẽ phải làm

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

76

Chỉ cho vui thôi:

from time import strptime

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

3
điều này có phụ thuộc vào ngôn ngữ của bạn không?
Janus Troelsen

Python 2.7 | ValueError: dữ liệu thời gian 'Fev' không khớp với định dạng '% b'
Diego Vinícius

@ DiegoVinícius khá chắc chắn 'Fev' phải là 'Tháng 2' ở đó.
Fawwaz Yusran

@FawwazYusran Diego đã thử ngôn ngữ địa phương, nhưng lệnh chỉ hoạt động đối với tên tháng bằng tiếng Anh
PythoNic

Điều này rất kém hiệu quả nếu được sử dụng trong một vòng lặp.
Ông Lance E Sloan

55

Sử dụng mô-đun lịch :

Number-to-Abbr calendar.month_abbr[month_number]

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


ví dụ: list (calendar.month_abbr) .index ('Feb') kết quả: 2
kibitzforu

Để sử dụng tên cả tháng:list(calendar.month_name).index('January')
Paul

Không tệ, nhưng không hiệu quả lắm nếu được sử dụng trong một vòng lặp để tra cứu tên tháng.
Ông Lance E Sloan

22

Đây là một cách khác để làm điều đó.

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]

bạn có thể làm điều tương tự như thế này: month_cal = dict((v,k) for v,k in zip(calendar.month_abbr[1:], range(1, 13))), và sau đómonth_cal[shortMonth]
Matt W.

3
Đó là một cách tốt. Cách tôi đã đề xuất không cần câu lệnh nhập. Đó là một vấn đề của sở thích.
Gi0rgi0s

20

Nguồn thông tin: Python Docs

Để lấy số tháng từ tên tháng, hãy sử dụng mô-đun 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

Đây là một phương pháp toàn diện hơn cũng có thể chấp nhận tên tháng đầy đủ

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

thí dụ:

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

Cái này tốt hơn cái của tôi ở trên
Gi0rgi0s 13/08/19

8

Một lần nữa:

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

0

Dựa trên những ý tưởng được trình bày ở trên, Điều này có hiệu lực khi thay đổi tên tháng thành số tháng thích hợp của nó:

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

Có thể tôi đang đọc nhầm những gì bạn đang nói, nhưng bạn có chắc nó không phải là từ [0: 3] không?
pseudoku

Không, nếu bạn nhìn lại, bạn sẽ thấy rằng chữ cái đầu tiên của từ [0] được sử dụng ở dạng chữ hoa và được nối với hai chữ cái tiếp theo, từ [1: 3]. Đoạn mã tôi đã đăng hoạt động thực sự độc đáo trong việc chuyển đổi các từ tháng thành số tháng thích hợp của chúng.
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)

Giải thích mã hóa của bạn luôn tốt hơn
Badro Niaimi

-1

Bạn có thể sử dụng bên dưới để thay thế.

  1. Số tháng:

from time import strptime

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

  1. Số tháng đến tháng:

import calendar

calendar.month_abbr[2] hoặc là calendar.month[2]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.