从数字中获取月份名称

如何从月份编号中获得月份名称?

例如,如果我有3,我想返回march

date.tm_month()

如何获得字符串march?

471218 次浏览
import datetime
mydate = datetime.datetime.now()
mydate.strftime("%B")

返回:12月

关于Python doc网站的更多信息


[编辑:来自@GiriB的精彩评论]你也可以使用%b,它返回月份名称的简短符号。

mydate.strftime("%b")

对于上面的例子,它将返回Dec

日历API

由此你可以看到calendar.month_name[3]将返回March,并且0的数组索引是空字符串,所以也没有必要担心零索引。

import datetime
mydate = datetime.datetime.now()
mydate.strftime("%B") # 'December'
mydate.strftime("%b") # 'dec'
import datetime


monthinteger = 4


month = datetime.date(1900, monthinteger, 1).strftime('%B')


print month

4月

如果(像我一样)你在数据框架中有一列月份数字,我会提供这个:

df['monthName'] = df['monthNumer'].apply(lambda x: calendar.month_name[x])

如果你只需要知道给定数字(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


...

这就是我要做的:

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

(这是我写这篇文章的真实日期)

我创建了自己的函数,将数字转换为对应的月份。

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

对于任意范围的月份数字

month_integer=range(0,100)
map(lambda x: calendar.month_name[x%12+start],month_integer)

将产生正确的列表。从month-integer列表中一月份开始的位置调整start-parameter。

datetime -基本日期和时间类型- Python文档

所有strftime格式代码的列表。月份的名称,以及格式化左零填充之类的好东西。阅读整页的内容,比如“天真”的规则;参数。以下是清单的简要内容:

%a  Sun, Mon, …, Sat
%A  Sunday, Monday, …, Saturday
%w  Weekday as number, where 0 is Sunday
%d  Day of the month 01, 02, …, 31
%b  Jan, Feb, …, Dec
%B  January, February, …, December
%m  Month number as a zero-padded 01, 02, …, 12
%y  2 digit year zero-padded 00, 01, …, 99
%Y  4 digit Year 1970, 1988, 2001, 2013
%H  Hour (24-hour clock) zero-padded 00, 01, …, 23
%I  Hour (12-hour clock) zero-padded 01, 02, …, 12
%p  AM or PM.
%M  Minute zero-padded 00, 01, …, 59
%S  Second zero-padded 00, 01, …, 59
%f  Microsecond zero-padded 000000, 000001, …, 999999
%z  UTC offset in the form +HHMM or -HHMM   +0000, -0400, +1030
%Z  Time zone name  UTC, EST, CST
%j  Day of the year zero-padded 001, 002, …, 366
%U  Week number of the year zero padded, Days before the first Sunday are week 0
%W  Week number of the year (Monday as first day)
%c  Locale’s date and time representation. Tue Aug 16 21:30:00 1988
%x  Locale’s date representation. 08/16/1988 (en_US)
%X  Locale’s time representation. 21:30:00
%%  literal '%' character.

一些 答案已经使用了日历,但是设置语言环境的效果还没有提到。

Calendar根据当前地区设置月份名称,例如在法语中:

import locale
import calendar


locale.setlocale(locale.LC_ALL, 'fr_FR')


assert calendar.month_name[1] == 'janvier'
assert calendar.month_abbr[1] == 'jan'

如果你计划在你的代码中使用setlocale,请确保阅读文档中的提示和注意事项< em >扩展作家< / em >部分。这里显示的示例不能代表它应该如何使用。特别是这两个部分:

在某些库例程中调用setlocale()通常不是一个好主意,因为它会影响整个程序[…]

扩展模块永远不应该调用setlocale()[…]

一次打印所有月份:

 import datetime


monthint = list(range(1,13))


for X in monthint:
month = datetime.date(1900, X , 1).strftime('%B')
print(month)

这个脚本展示了如何获得数据帧中月份变量/列的日历月缩写。注意,假设month列/变量的值都是数字,可能会有一些缺失的值。

# 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']]

而不是导入或下载一个新的库,你可以使用我的手动功能:

将代码复制到一个新的.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=your_number)


print(month_from_num)

结果将在10月份公布

'01'到'Jan'

from datetime import datetime


datetime.strptime('01', "%m").strftime("%b")

如果你只有月份号而没有datetime实例,你可以构建一个小函数来映射number和label,如下所示:

def monthname(m):
d={1:'En',2:'Fe',3:'Mr',4:'Ab',5:'My',6:'Jn',7:'Jl',8:'Ag',9:'Se',10:'Oc',11:'No',12:'Di'}
return d[m]

来自一个相关的SO问题关于生成月份名称列表。

关于这个问题的许多选项,就像这个,建议使用日历模块,尽管datetime列表推导式也是可能的:

month_names = [dt.datetime.strptime(str(n), '%m').strftime('%B') for n in range(1, 13)]

如果您是从为大量整数查找月份名称的角度来处理这个问题的,那么为预先生成的列表建立索引可能会提高效率。