说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置 calendar 模块提供与日历有关功能,可以帮助我们做时间日期相关的计算,省去复杂的判断,比较实用。
这个模块让你可以输出像 Unix cal 那样的日历,它还提供了其它与日历相关的实用函数。 默认情况下,这些日历把星期一当作一周的第一天,星期天为一周的最后一天(按照欧洲惯例)。 可以使用 setfirstweekday() 方法设置一周的第一天为星期天 (6) 或者其它任意一天。 使用整数作为指定日期的参数。 更多相关的函数,参见 datetime 和 time 模块。
在这个模块中定义的函数和类都基于一个理想化的日历,现行公历向过去和未来两个方向无限扩展。这与 Dershowitz 和 Reingold 的书 "历法计算" 中所有计算的基本日历 -- "proleptic Gregorian" 日历的定义相符合。 ISO 8601 标准还规定了 0 和 负数年份。0年指公元前1年, -1年指公元前2年,依此类推。
打印出一个指定年份的日历:
import calendar
c = calendar.calendar(2022)
print(c)
'''
2022
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3 4 5 6
3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13
10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20
17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27
24 25 26 27 28 29 30 28 28 29 30 31
31
...
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3 4
3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11
10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18
17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25
24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31
31
'''
本模块主要以下几个类:
calendar.xxx
: 基于本地时间的日历属性和方法calendar.Calendar(firstweekday=0)
: 创建一个 Calendar 对象。calendar.TextCalendar(firstweekday=0)
: 生成纯文本日历。calendar.HTMLCalendar(firstweekday=0)
: 生成 HTML 日历。class calendar.Calendar(firstweekday=0)
创建一个 Calendar 对象。 firstweekday 是一个整数,用于指定一周的第一天。 0 是星期一(默认值),6 是星期天。Calendar
对象提供了一些可被用于准备日历数据格式化的方法。 这个类本身不执行任何格式化操作。 这部分任务应由子类来完成。
import calendar
# 创建一个日历,默认周一开始
c = calendar.Calendar()
相关方法:
# 返回一个迭代器,内容为一个完整星期的数字
c.iterweekdays()
# <generator object Calendar.iterweekdays at 0xxxx>
[*c.iterweekdays()]
# [0, 1, 2, 3, 4, 5, 6]
# 指定年月的日期迭代器
# 还包含了本月头尾用于组成完整一周的日期
[*c.itermonthdates(2022, 11)]
'''
[datetime.date(2022, 10, 31),
datetime.date(2022, 11, 1),
datetime.date(2022, 11, 2),
datetime.date(2022, 11, 3),
...
datetime.date(2022, 11, 30),
datetime.date(2022, 12, 1),
datetime.date(2022, 12, 2),
datetime.date(2022, 12, 3),
datetime.date(2022, 12, 4)]
'''
# 与 c.itermonthdates 类似,但迭代器的元素只有
# 日期对应的天数字,不在当月的日期,显示为 0
[*c.itermonthdays(2022, 11)]
'''
[0,
1,
2,
3,
...
29,
30,
0,
0,
0,
0]
'''
# 与 c.itermonthdates 类似,迭代器的元素为一个
# 由日期和代表星期几的数字组成的的元组
[*c.itermonthdays2(2022, 11)]
'''
[(0, 0),
(1, 1),
(2, 2),
(3, 3),
...
(29, 1),
(30, 2),
(0, 3),
(0, 4),
(0, 5),
(0, 6)]
'''
# 与 c.itermonthdates 类似,迭代器的元素为一个
# 由年,月,日组成的元组
[*c.itermonthdays3(2022, 11)]
'''
[(2022, 10, 31),
(2022, 11, 1),
(2022, 11, 2),
(2022, 11, 3),
...
(2022, 11, 30),
(2022, 12, 1),
(2022, 12, 2),
(2022, 12, 3),
(2022, 12, 4)]
'''
# 与 c.itermonthdates 类似,迭代器的元素为
# 一个由年,月,日和代表星期几的数字组成的元组
[*c.itermonthdays4(2022, 11)]
'''
[(2022, 10, 31, 0),
(2022, 11, 1, 1),
(2022, 11, 2, 2),
(2022, 11, 3, 3),
...
(2022, 11, 30, 2),
(2022, 12, 1, 3),
(2022, 12, 2, 4),
(2022, 12, 3, 5),
(2022, 12, 4, 6)]
'''
# 指定年月的周列表,每个子列表里
# 有 7 个 datetime.date 日期对象
c.monthdatescalendar(2022, 11)
'''
[[datetime.date(2022, 10, 31),
datetime.date(2022, 11, 1),
datetime.date(2022, 11, 2),
datetime.date(2022, 11, 3),
datetime.date(2022, 11, 4),
datetime.date(2022, 11, 5),
datetime.date(2022, 11, 6)],
....
[datetime.date(2022, 11, 28),
datetime.date(2022, 11, 29),
datetime.date(2022, 11, 30),
datetime.date(2022, 12, 1),
datetime.date(2022, 12, 2),
datetime.date(2022, 12, 3),
datetime.date(2022, 12, 4)]]
'''
# 与 c.monthdatescalendar 类似
# 周列表由七个代表日期的数字和代表周几
# 的数字组成的二元元组
c.monthdays2calendar(2022, 11)
'''
[[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)],
...
[(28, 0), (29, 1), (30, 2), (0, 3), (0, 4), (0, 5), (0, 6)]]
'''
# 与 c.monthdatescalendar 类似
# 返回一个表示指定年月的周列表
# 周列表由七个代表日期的数字组成
c.monthdayscalendar(2022, 11)
'''
[[0, 1, 2, 3, 4, 5, 6],
[7, 8, 9, 10, 11, 12, 13],
[14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27],
[28, 29, 30, 0, 0, 0, 0]]
'''
# 返回的值是一个列表,列表是月份组成的行
# 每一行包含了最多 width 个月(默认为3)
# 每个月包含了4到6周,每周包含1--7天,结构示意如下:
# [年-[月批次width值-[月-[周的7个日期]-月]-月批次]-年]
c.yeardatescalendar(2022, width=3)
'''
[[[[datetime.date(2021, 12, 27),
datetime.date(2021, 12, 28),
datetime.date(2021, 12, 29),
datetime.date(2021, 12, 30),
datetime.date(2021, 12, 31),
datetime.date(2022, 1, 1),
datetime.date(2022, 1, 2)],
...
[datetime.date(2022, 12, 26),
datetime.date(2022, 12, 27),
datetime.date(2022, 12, 28),
datetime.date(2022, 12, 29),
datetime.date(2022, 12, 30),
datetime.date(2022, 12, 31),
datetime.date(2023, 1, 1)]]]]
'''
# 与 c.yeardatescalendar 类似
# 周列表的元素是由表示日期的数字和表示
# 星期几的数字组成的元组, 不在这个月的日子为 0
c.yeardays2calendar(2022, width=3)
'''
...
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 5), (2, 6)]
...
'''
# 与 c.yeardatescalendar 类似
# 周列表的元素是表示日期的数字
# 不在这个月的日子为 0
c.yeardayscalendar(2022, width=3)
'''
...
[0, 0, 0, 0, 0, 1, 2],
[3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16],
...
'''
使用 class calendar.TextCalendar(firstweekday=0)
这个类可以生成纯文本日历。TextCalendar 实例有以下方法:
import calendar
# 创建一个文本日历,默认周一开始
c = calendar.TextCalendar()
# 多行字符串来表示指定年月的日历
# w 为日期的宽度, l 指定每星期占用的行数
fm = c.formatmonth(2022, 11, w=3, l=1)
print(fm)
'''
November 2022
Mon Tue Wed Thu Fri Sat Sun
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
'''
# 与 c.formatmonth 相同,直接打印
c.prmonth(2022, 11, w=0, l=0)
# 多行字符串 m 列日历
# w, l, 和 c 表示日期列数、周的行数、月之间间隔
fy = c.formatyear(2022, w=2, l=1, c=6, m=3)
print(fy)
'''
...(想像下,这是开头的那样的日历)
'''
# 与 c.formatyear 相同,直接打印
c.pryear(2022, w=2, l=1, c=6, m=3)
可以使用 class calendar.HTMLCalendar(firstweekday=0)
这个类生成 HTML 日历。HTMLCalendar 实例有以下方法:
import calendar
c = calendar.HTMLCalendar()
# 返回一个 HTML 表格作为指定年月的日历
# withyear 为真,则年份将会显示在表头,否则只显示月份。
fm = c.formatmonth(2021, 11, withyear=True)
# 可以在 jupyter notebooks 用以下代码进行显示
from IPython.core.display import display, HTML
display(HTML(fm))
# 返回一个 HTML 表格作为指定年份的日历
# width (默认为3) 用于规定每一行显示月份的数量
fm = c.formatyear(2022, width=3)
# 返回一个完整的 HTML 页面作为指定年份的日历
# width*(默认为3) 用于规定每一行显示的月份数量
# *css 为层叠样式表的名字。如果不使用可传 None
# encoding 为输出页面的编码 (默认为系统的默认编码)。
fm = c.formatyearpage(2022, width=3,
css='calendar.css',
encoding=None)
HTMLCalendar 有以下属性,你可以重载它们来自定义应用日历的样式。
# 一个对应星期一到星期天的 CSS class 列表
c.cssclasses
# ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
# 可以向每天加入其它样式
cssclasses = ["mon text-bold", "tue", "wed",
"thu", "fri", "sat", "sun red"]
# 工作日的 CSS 类在上个月或下个月发生
c.cssclass_noday
# 'noday'
# 用于标题行中的工作日名称的 CSS 类列表
# 默认值与 cssclasses 相同。
c.cssclasses_weekday_head
# ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
# 月份的头 CSS 类(由 formatmonthname() 使用)
c.cssclass_month_head
# 'month'
# 某个月的月历的 CSS 类(由 formatmonth() 使用)
c.cssclass_month
# 'month'
# 某年的年历的 CSS 类(由 formatyear() 使用)
c.cssclass_year
# 'year'
# 年历的·表头 CSS 类(由 formatyear() 使用)
c.cssclass_year_head
# 'year'
需要注意的是,尽管上面命名的样式类都是单独出现的(如: cssclass_month cssclass_noday
), 但我们可以使用空格将样式类列表中的多个元素分隔开,例如:"text-bold text-red"
。
class calendar.LocaleTextCalendar(firstweekday=0, locale=None)
这个子类 TextCalendar 可以在构造函数中传递一个语言环境名称,并且返回月份和星期几的名称在特定语言环境中。如果此语言环境包含编码,则包含月份和工作日名称的所有字符串将作为 unicode 返回。
class calendar.LocaleHTMLCalendar(firstweekday=0, locale=None)
HTMLCalendar 的这个子类可以在构造函数中传递一个地区名称,并将返回指定地区中的月份和工作日名称。如果此区域设置包含编码,则包含月份和工作日名称的所有字符串都将作为unicode返回。
注: 这两个类的 formatweekday() 和 formatmonthname() 方法临时更改dang当前区域至给定 locale 。由于当前的区域设置是进程范围的设置,因此它们不是线程安全的。
calendar 模块提供了以下的方法:
import calendar
# 设置每一周的开始(0 表示星期一,6 表示星期天)
calendar.setfirstweekday(6) # 无返回
# 还提供了 MONDAY, TUESDAY, WEDNESDAY,
# THURSDAY, FRIDAY, SATURDAY 和 SUNDAY
# 几个常量方便使用。例如,设置每周的第一天为星期天
calendar.setfirstweekday(calendar.SUNDAY)
# 返回当前设置的每星期的第一天的数值
calendar.firstweekday()
# 6
# 是否 闰年?
calendar.isleap(2022)
# False
# 返回在两年(均包含)之间的闰年的年数
calendar.leapdays(2022, 2030)
# 2
# 蓝天是星期几( 0 是星期一)?
calendar.weekday(2022, 11, 1)
# 1
# 返回一个包含星期几的缩写,n 为缩写长度宽度
calendar.weekheader(2)
# 'Su Mo Tu We Th Fr Sa'
# 返回指定 年份月份 的第一天是(星期几, 这个月的天数)
calendar.monthrange(2022, 11)
# (1, 30)
# 返回表示一个月的日历的矩阵
# 每一行代表一周;此月份外的日子由零表示
# 每周从周一开始,除非设置 setfirstweekday()
calendar.monthcalendar(2022, 11)
'''
[[0, 0, 1, 2, 3, 4, 5],
[6, 7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26],
[27, 28, 29, 30, 0, 0, 0]]
'''
# 使用 TextCalendar 类的 formatmonth()
# 以多行字符串形式返回月份日历
calendar.month(2022, 11, w=0, l=0)
# 打印由 month() 返回的一个月的日历
calendar.prmonth(2022, 11, w=0, l=0)
# 使用 TextCalendar 类的 formatyear() 返回
# 整年的3列的日历以多行字符串的形式
calendar.calendar(2022, w=2, l=1, c=6, m=3)
# 打印由 calendar() 返回的整年的日历
calendar.prcal(year, w=0, l=0, c=6, m=3)
# 接受一个时间元组例如 time 模块中的函数的
# 返回并返回相应的 Unix 时间戳值,假定 1970 年
# 开始计数, POSIX 编码。
# 实际上, time.gmtime() 和 timegm() 是彼此相反的
calendar.timegm(time.gmtime())
# 1632236962
import time
time.gmtime()
'''
time.struct_time(tm_year=2021, tm_mon=9, tm_mday=21,
tm_hour=15, tm_min=9, tm_sec=13,
tm_wday=1, tm_yday=264, tm_isdst=0)
'''
calendar 模块包含以下数据属性:
import calendar
# 迭代器元素为在当前语言环境下表示星期几的数组
[*calendar.day_name]
# ['Monday', 'Tuesday', 'Wednesday',
# 'Thursday', 'Friday', 'Saturday', 'Sunday']
# 迭代器元素为在当前语言环境下表示星期几缩写的数组
[*calendar.day_abbr]
# ['Mon', 'Tue', 'Wed', 'Thu',
# 'Fri', 'Sat', 'Sun']
# 迭代器元素为在当前语言环境下表示一年中月份的数组。
# 这遵循一月的月号为 1 的通常惯例,所以它的长度
# 为 13 且 month_name[0] 是空字符串
[*calendar.month_name]
'''
['',
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December']
'''
# 与 calendar.month_name 类似
# 月份的缩写
[*calendar.month_abbr]
'''
['',
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec']
'''
更新时间:2021-09-21 23:11:12 标签:python 日历