从数字中获取月份名称
Posted
技术标签:
【中文标题】从数字中获取月份名称【英文标题】:Get month name from number 【发布时间】:2011-09-27 07:18:48 【问题描述】:如何从月份编号中获取月份名称?
例如,如果我有3
,我想返回march
date.tm_month()
如何获取字符串march
?
【问题讨论】:
【参考方案1】:import datetime
mydate = datetime.datetime.now()
mydate.strftime("%B")
返回:12 月
更多关于Python doc website的信息
[编辑:来自@GiriB 的精彩评论] 您还可以使用%b
,它返回月份名称的短符号。
mydate.strftime("%b")
对于上面的示例,它将返回Dec
。
【讨论】:
如果您只需要知道给定数字 (1 - 12) 的月份名称,这不是很有帮助,因为当天无关紧要。 calendar.month_name[i] 或 calendar.month_abbr[i] 在这里更有用。mydate.strftime("%b")
返回月份名称的简写。 (对于上面的例子,它会返回Dec
)
OP希望使用整数作为输入,而不是 datetime.datetime 对象。您可以使用 mydate = datetime.datetime(2019, integer , 1, 0, 0) 但它相当难看跨度>
我看不出这是如何回答问题的。
请注意,如果使用非英语语言环境,%B 可能会在错误的情况下返回月份名称。例如对于 ru_RU 语言环境,%B 返回“января”而不是“январь”。【参考方案2】:
Calendar API
从中可以看出calendar.month_name[3]
会返回March
,而0
的数组索引是空字符串,所以也不用担心零索引。
【讨论】:
您也可以使用 calendar.month_abbr[i] 作为短月份名称 - 例如三月。 注意:您可能需要在文件顶部import calendar
才能使用它。
如果有人想在 pandas 中执行此操作,解决方案在这里:***.com/questions/36010999/…。只是这是在字符串格式问题中查找月份名称时出现的第一个结果。想放在这里以防万一。【参考方案3】:
import datetime
monthinteger = 4
month = datetime.date(1900, monthinteger, 1).strftime('%B')
print month
四月
【讨论】:
有趣。我喜欢这个观点。最好指出,对于这个用例,年份和月份的数字日期 (1..31) 是不相关的,并且不会更改此函数调用的输出。这就是为什么可以用任意(但有效)值对它们进行硬编码。通常,突出显示您的答案中专门解决 OP 问题的部分是一个好主意,并指出使用代码时的任何注意事项。解释增加了长期价值,促进了知识的传播,并增加了投票的可能性。通常不鼓励仅使用代码回答,以保持高质量 另外,在这里包含%B
的含义会很有帮助,这样未来的访问者可以快速了解此功能的方式/原因,以及您的代码如何工作,并可以立即将其应用到他们的自己的代码。解释有助于快速吸收知识,提供完全不言自明的解决方案;-)。【参考方案4】:
如果您只需要知道给定数字 (1 - 12) 的月份名称,这并不是很有帮助,因为当天无关紧要。
calendar.month_name[i]
或
calendar.month_abbr[i]
在这里更有用。
这是一个例子:
import calendar
for month_idx in range(1, 13):
print (calendar.month_name[month_idx])
print (calendar.month_abbr[month_idx])
print ("")
示例输出:
January
Jan
February
Feb
March
Mar
...
【讨论】:
感谢您的回答。如果我可以添加建议,您可以添加一些输入和输出示例,以展示如何使用此代码以及month_name
和 month_abbr
之间的区别
这很有帮助,我建议在您的示例中使用range(1, 13)
,这样您就可以在输出中获得全部 12 个月。
好点。 range(start, end) 从开始到结束,但不包括结束。即使用 start ... end-1。【参考方案5】:
import datetime
mydate = datetime.datetime.now()
mydate.strftime("%B") # 'December'
mydate.strftime("%b") # 'dec'
【讨论】:
【参考方案6】:一次打印所有月份:
import datetime
monthint = list(range(1,13))
for X in monthint:
month = datetime.date(1900, X , 1).strftime('%B')
print(month)
【讨论】:
【参考方案7】:如果(像我一样)您在数据框中有一列月份数字,我会提供此功能:
df['monthName'] = df['monthNumer'].apply(lambda x: calendar.month_name[x])
【讨论】:
【参考方案8】:这就是我要做的:
from datetime import *
months = ["Unknown",
"January",
"Febuary",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"]
now = (datetime.now())
year = (now.year)
month = (months[now.month])
print(month)
它输出:
>>> September
(这是我写这篇文章的真实日期)
【讨论】:
【参考方案9】:部分goodanswers已经使用calendar,但尚未提及设置locale的效果。
日历根据当前区域设置月份名称,例如法语:
import locale
import calendar
locale.setlocale(locale.LC_ALL, 'fr_FR')
assert calendar.month_name[1] == 'janvier'
assert calendar.month_abbr[1] == 'jan'
如果您打算在代码中使用setlocale
,请务必阅读文档中的tips and caveats 和extension writer 部分。此处显示的示例不代表应如何使用。特别是从这两个部分:
在某些库例程中调用 setlocale() 通常是个坏主意,因为它会影响整个程序 […]
扩展模块不应该调用 setlocale() […]
【讨论】:
很好的补充,只是我建议添加一个后备文化或只是将 setLocale 调用包装在 try/except 中,因为如果该文化不可用,你会得到一个异常(在尝试这个之后发生在我身上;)) 我想我会保留代码,因为设置语言环境可能不是您在该代码附近无论如何都会做的事情。我只是想强调设置语言环境如何影响来自calendar
的值。我也许可以更新文本。【参考方案10】:
8.1。 datetime — 基本日期和时间类型 — Python 2.7.17 文档 https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior
所有 strftime 参数的列表。月份名称和诸如格式化之类的好东西会留下零填充。阅读完整页面,了解诸如“幼稚”论点的规则之类的内容。以下是简要清单: %a 周日、周一、...、周六
%A 星期日、星期一、……、星期六
%w 工作日为数字,其中 0 为星期日
%d 月中的第 01、02、...、31 天
%b 一月、二月、...、十二月
%B 一月、二月、……、十二月
%m 以零填充的月份数 01, 02, ..., 12
%y 2 位数年份,零填充 00, 01, ..., 99
%Y 4 位数 1970、1988、2001、2013 年
%H 小时(24 小时制)零填充 00, 01, ..., 23
%I 小时(12 小时制)零填充 01、02、...、12
%p 上午或下午。
%M 分钟零填充 00, 01, ..., 59
%S 第二个零填充 00, 01, ..., 59
%f 微秒零填充 000000, 000001, ..., 999999
%z UTC 偏移量,格式为 +HHMM 或 -HHMM +0000, -0400, +1030
%Z 时区名称 UTC、EST、CST
%j 一年中的第几天零填充 001, 002, ..., 366
%U 一年中的周数用零填充,第一个星期日之前的几天是第 0 周
%W 一年中的第几周(星期一为第一天)
%c 语言环境的日期和时间表示。 1988 年 8 月 16 日星期二 21:30:00
%x 语言环境的日期表示。 1988 年 8 月 16 日(zh_CN)
%X 语言环境的时间表示。 21:30:00
%% 文字 '%' 字符。
【讨论】:
【参考方案11】:对于月份数字的任意范围
month_integer=range(0,100)
map(lambda x: calendar.month_name[x%12+start],month_integer)
将产生正确的列表。调整 start
-parameter 从月份整数列表中一月开始的位置。
【讨论】:
【参考方案12】:此脚本用于展示如何获取数据框中月份变量/列的日历月份缩写。请注意,假设月份列/变量的值都是数字,可能存在一些缺失值。
# Import the calendar module
import calendar
# Extract month as a number from the date column
df['Month']=pd.DatetimeIndex(df['Date']).month
# Using list comprehension extract month abbreviations for each month number
df['Month_abbr']=[calendar.month_abbr[int(i)] if pd.notna(i) else i for i in df['Month']]
【讨论】:
添加一个关于你的代码如何工作的描述会很好;这将进一步帮助访问者 @BusyProgrammer 谢谢你的建议,我现在已经添加了描述。【参考方案13】:您可以使用我的手动功能,而不是导入或下载新的库:
将代码复制到一个新的 .py 文件并运行它
快速解释:
更改 your_number 并打印 month_from_number,您将获得月份
your_number = 10
def num_to_month(*args, **kwargs):
num = kwargs.get("num", None)
if int(num) <= 12 and int(num) > 0:
list_of_months = '1': 'January', '2': 'February', '3': 'March',
'4': 'April', '5': 'May', '6': 'June', '7': 'July',
'8': 'August', '9': 'September', '10': 'October',
'11': 'November', '12': 'December'
return list_of_months[num]
else:
print('num_to_month function error: "num=' + str(num) + '"')
month_from_num = num_to_month(num=str(your_number))
print(month_from_number)
结果将是 10 月
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。【参考方案14】:我创建了自己的函数,将数字转换为对应的月份。
def month_name (number):
if number == 1:
return "January"
elif number == 2:
return "February"
elif number == 3:
return "March"
elif number == 4:
return "April"
elif number == 5:
return "May"
elif number == 6:
return "June"
elif number == 7:
return "July"
elif number == 8:
return "August"
elif number == 9:
return "September"
elif number == 10:
return "October"
elif number == 11:
return "November"
elif number == 12:
return "December"
然后我可以调用该函数。例如:
print (month_name (12))
输出:
>>> December
【讨论】:
如其他答案所示,此功能已存在于内置calendar
模块中。创建自己的函数来复制相同的结果有什么好处?此外,字典会比一系列 elif 语句快得多。
除所有其他问题外,您的功能仅适用于英语语言环境以上是关于从数字中获取月份名称的主要内容,如果未能解决你的问题,请参考以下文章