模块简介
calendar 模块基于一个名为 gregorian 的日历系统(公历),是 Python 的标准库之一,无需额外安装,它的核心功能围绕“年”和“月”这两个概念展开。
常用函数和属性
下面我将 calendar 模块中最常用的功能分为几类进行介绍,并配有代码示例。
1 获取特定日期的信息
这类函数用于查询某个日期是星期几,或者一年有多少天等。
calendar.weekday(year, month, day)- 返回给定日期是星期几(0代表星期一,6代表星期日)。
- 返回值是整数。
import calendar
# 查询 2025年10月1日 是星期几
# 返回 0 (周一), 1 (周二), ..., 6 (周日)
day_of_week = calendar.weekday(2025, 10, 1)
print(f"2025年10月1日是星期: {day_of_week}") # 输出: 0 (星期一)
calendar.monthrange(year, month)- 返回一个元组
(first_weekday, number_of_days)。first_weekday: 该月第一天是星期几(0=周一, 6=周日)。number_of_days: 该月总共有多少天。
- 返回一个元组
import calendar
# 查询 2025年10月 的信息
first_day, num_days = calendar.monthrange(2025, 10)
print(f"2025年10月的第一天是星期: {first_day}") # 输出: 0 (星期一)
print(f"2025年10月总共有: {num_days} 天") # 输出: 31
calendar.isleap(year)- 判断某一年是否是闰年,如果是闰年返回
True,否则返回False。
- 判断某一年是否是闰年,如果是闰年返回
import calendar
print(f"2025年是闰年吗? {calendar.isleap(2025)}") # 输出: True
print(f"2025年是闰年吗? {calendar.isleap(2025)}") # 输出: False
calendar.leapdays(year1, year2)- 返回在
year1到year2之间(不包括year2)的闰年总数。
- 返回在
import calendar
# 计算 2000年到2025年之间有多少个闰年
num_leap_days = calendar.leapdays(2000, 2025)
print(f"2000年到2025年之间有 {num_leap_days} 个闰年") # 输出: 7 (2000, 2004, 2008, 2012, 2025, 2025)
2 生成日历文本
这是 calendar 模块最核心的功能,可以生成各种格式的日历。
calendar.calendar(year, w=2, l=1, c=6, m=3)- 生成一个指定年份的全年日历,以多行字符串形式返回。
w: 每个日期的字符宽度(默认2)。l: 每周所占的行数(默认1)。c: 月份之间的间隔字符数(默认6)。m: 每行显示的月份数(默认3)。
import calendar # 生成 2025 年的全年日历 cal_2025 = calendar.calendar(2025) print(cal_2025)
calendar.month(year, month, w=2, l=1)生成一个指定年月的日历,以字符串形式返回。
import calendar # 生成 2025年10月的日历 oct_2025 = calendar.month(2025, 10) print(oct_2025)
calendar.monthcalendar(year, month)- 返回一个“月历”的列表,这是一个非常有用的函数,它返回一个列表的列表(一个二维列表)。
- 每个子列表代表一周。
- 如果某一天不属于当前月份,则用
0表示。 - 这对于数据分析或按周处理日期非常方便。
import calendar
# 获取 2025年10月的月历数据
# 第一周是 [0, 0, 1, 2, 3, 4, 5] 表示9月30日(0)和10月1-5日
month_cal = calendar.monthcalendar(2025, 10)
print("2025年10月的月历数据:")
for week in month_cal:
print(week)
3 格式化输出 (calendar.TextCalendar 和 calendar.HTMLCalendar)
calendar 模块提供了两个类,可以更灵活地定制日历的格式。
calendar.TextCalendar(firstweekday=0)- 用于生成纯文本格式的日历。
firstweekday参数可以设置一周的第一天是星期几(0=周一, 6=周日)。
- 用于生成纯文本格式的日历。
import calendar # 创建一个以星期日为第一天的日历对象 # 默认 firstweekday=0 (周一) us_cal = calendar.TextCalendar(firstweekday=6) # 6 代表星期日 # 生成 2025年10月的日历 print(us_cal.formatmonth(2025, 10))
calendar.HTMLCalendar(firstweekday=0)用于生成 HTML 格式的日历,可以直接嵌入到网页中。
import calendar
# 创建一个HTML日历对象
html_cal = calendar.HTMLCalendar(firstweekday=0) # 周一为第一天
# 生成 2025年10月的HTML日历
html_output = html_cal.formatmonth(2025, 10)
# 将HTML输出到文件或直接打印
with open("calendar.html", "w", encoding="utf-8") as f:
f.write(html_output)
print("HTML 日历已生成到 calendar.html 文件")
综合示例:查找所有“黑色星期五”
“黑色星期五”指的是一个月的13号正好是星期五,我们可以用 calendar 模块轻松地找出某一年中所有的黑色星期五。
import calendar
def find_black_fridays(year):
"""
查找指定年份中所有的“黑色星期五”(13号是星期五)。
"""
black_fridays = []
for month in range(1, 13):
# weekday(年, 月, 13) 返回13号是星期几
# 如果返回 4,则表示是星期五 (0=周一, 4=周五)
if calendar.weekday(year, month, 13) == 4:
black_fridays.append(f"{year}年{month}月13日")
return black_fridays
# 查找 2025 年的黑色星期五
bf_2025 = find_black_fridays(2025)
print(f"2025年的黑色星期五有: {', '.join(bf_2025)}")
# 输出: 2025年的黑色星期五有: 2025年1月13日, 2025年10月13日
# 查找 2025 年的黑色星期五
bf_2025 = find_black_fridays(2025)
print(f"2025年的黑色星期五有: {', '.join(bf_2025)}")
# 输出: 2025年的黑色星期五有: 2025年9月13日
小结
| 功能类别 | 函数/方法 | 描述 |
|---|---|---|
| 信息查询 | calendar.weekday(y, m, d) |
返回星期几 (0-6) |
calendar.monthrange(y, m) |
返回 (第一天星期几, 该月天数) | |
calendar.isleap(y) |
判断是否为闰年 | |
| 文本生成 | calendar.calendar(y) |
生成全年文本日历 |
calendar.month(y, m) |
生成单月文本日历 | |
calendar.monthcalendar(y, m) |
返回月历的二维列表 | |
| 格式化类 | calendar.TextCalendar |
用于生成纯文本日历 |
calendar.HTMLCalendar |
用于生成HTML日历 |
calendar 模块虽然功能不算极其复杂,但对于处理日常的日历任务来说已经非常足够,掌握它能让你在编写需要日期处理的脚本时事半功倍。
