2010-08-05 74 views
48

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ĩ rằng đâ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ực tuyến.tên tháng thành số tháng và ngược lại trong python

Tôi đã suy nghĩ về mô-đun calendar. 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ó thể thực hiện calendar.month_abbr[num]. Tôi không thấy một con đường để đi theo hướng khác mặc dù. Việc tạo một 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 là có một cách tốt hơn để đi từ tên tháng đến số tháng và ngược lại?

Trả lời

47

Tạo một từ điển ngược sẽ là một cách hợp lý để thực hiện điều này, bởi vì nó khá đơn giản:

import calendar 
dict((v,k) for k,v in enumerate(calendar.month_abbr)) 

hoặc trong các phiên bản gần đây của Python (2.7+) có hỗ trợ hiểu từ điển:

{v: k for k,v in enumerate(calendar.month_abbr)} 
+0

isnt này làm việc cho tôi vì một lý do, >>> d = dict (v, k cho k, v trong calendar.month_abbr) File "", dòng 1 Lỗi Cú pháp : Biểu thức máy phát phải được ngoặc đơn nếu không phải là đối số duy nhất –

+1

Hmmm, tôi đã làm điều này và nó đã hoạt động ... d = dict ((v, k) cho k, v trong liệt kê (calendar.month_abbr)) –

+0

@Mark_Masoul: Phiên bản nào của Python? Trông khá cũ. –

51

Chỉ để cho vui:

from time import strptime 

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

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

+0

Nó hoạt động trong trường hợp của tôi cảm ơn –

11

Đây là một cách khác để thực hiện.

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] 
27

Sử dụng calendar mô-đun:

Số-to-Abbr calendar.month_abbr[month_number]

Abbr-to-Số list(calendar.month_abbr).index(month_abbr)

5

Một hơn:

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

cô e là một phương pháp toàn diện hơn mà 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') 

dụ:

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

Để có được tên tháng bằng số tháng, bạn có thể sử dụng time:

import time 

mn = 11 
print time.strftime('%B', time.struct_time((0, mn, 0,)+(0,)*6)) 

'November' 
3

Thông tin source: Python Docs

Để nhận số tháng fro m tên tháng 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') 
Các vấn đề liên quan