我正在尝试创建一个函数,可以将月份编号转换为缩写的月份名称或缩写的月份名称转换为月份编号。我认为这可能是一个常见的问题,但我无法在网上找到它。
我在考虑calendar模块。我看到要将月份号码转换为缩写的月份名称,您只需执行calendar.month_abbr[num]
即可。我没有办法走向另一个方向。创建用于转换其他方向的字典是否是处理此问题的最佳方法?或者有更好的方法从月份名称到月份号码,反之亦然?
答案 0 :(得分:66)
创建反向字典是一种合理的方法,因为它非常简单:
import calendar
dict((v,k) for k,v in enumerate(calendar.month_abbr))
或最近版本的Python(2.7+)支持词典理解:
{v: k for k,v in enumerate(calendar.month_abbr)}
答案 1 :(得分:64)
只是为了好玩:
from time import strptime
strptime('Feb','%b').tm_mon
答案 2 :(得分:36)
使用calendar模块:
号到缩写
calendar.month_abbr[month_number]
缩写到数
list(calendar.month_abbr).index(month_abbr)
答案 3 :(得分:15)
这是另一种方法。
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]
答案 4 :(得分:13)
这是一个更全面的方法,也可以接受完整的月份名称
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
答案 5 :(得分:7)
还有一个:
def month_converter(month):
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
return months.index(month) + 1
答案 6 :(得分:1)
要使用月份编号获取月份名称,您可以使用time
:
import time
mn = 11
print time.strftime('%B', time.struct_time((0, mn, 0,)+(0,)*6))
'November'
答案 7 :(得分:0)
在上述思想的基础上,这是有效的:
from time import strptime
word = 'september'
new = word[0].upper() + word[1:3].lower()
strptime(new,'%b').tm_mon
答案 8 :(得分:0)
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)
答案 9 :(得分: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)
答案 10 :(得分:0)
def month_num2abbr(month):
month = int(month)
import calendar
months_abbr = {month: index for index, month in enumerate(calendar.month_abbr) if month}
for abbr, month_num in months_abbr.items():
if month_num==month:
return abbr
return False
print(month_num2abbr(7))
答案 11 :(得分:0)
如果您不想导入日历库,并且需要更强大的功能,则可以使您的代码比某些某些文本动态性更高 提供的其他解决方案。您可以:
month_to_number
词典.items()
,并检查字符串s
的小写字母是否在小写键k
中。month_to_number = {
'January' : 1,
'February' : 2,
'March' : 3,
'April' : 4,
'May' : 5,
'June' : 6,
'July' : 7,
'August' : 8,
'September' : 9,
'October' : 10,
'November' : 11,
'December' : 12}
s = 'jun'
[v for k, v in month_to_number.items() if s.lower() in k.lower()][0]
Out[1]: 6
同样,如果您有一个列表l
而不是字符串,则可以添加另一个for
以遍历该列表。我创建的列表的值不一致,但是对于正确的月份数,仍然需要输出:
l = ['January', 'february', 'mar', 'Apr', 'MAY', 'JUne', 'july']
[v for k, v in month_to_number.items() for m in l if m.lower() in k.lower()]
Out[2]: [1, 2, 3, 4, 5, 6, 7]
这里的用例是,我正在使用Selenium
通过根据某些条件自动选择下拉值来从网站中抓取数据。无论如何,这要求我依靠一些我认为我们的供应商每月都会手动输入的数据来命名标题,并且如果它们的格式设置与历史记录略有不同,我也不想回到我的代码中。
答案 12 :(得分:-1)
您可以使用以下替代方法。
from time import strptime
strptime('Feb','%b').tm_mon
import calendar
calendar.month_abbr[2]
或
calendar.month[2]