假期增加2天!matplotlib绘制2025年一整年日历
假期增加
变化
春节增加一天假期,也可以理解为现在除夕也放假。
劳动节增加一天假期,也可以理解为现在5月2日也放假。
因为,现在春节有4天假期,那么必然会包含一个双休日,也就是6天,因此,只需要增加1天或者2天,就会到达下一个双休日,考虑这样两种情况:
- 如果春节在周一至周四,或者周二至周五,那么一定会连接前/后的双休日,此时休息为6天,但是只需要一天,就可以连接到相邻的双休日,因此最少只需要调休1天。
- 如果春节包含双休日,同样可以连接为6天,当然,这6天如果是希望按照周三,周四,周五,周六,周日,周一进行休息的话,那么确实需要调休2天可以到达8天。
劳动节现在有2天,那么是否一定会包含一个双休日呢,我们考虑这样几种情况:
- 如果5月1日与2日分别是周一,周二,或者周四,周五,那么其前后一定包含一个双休日,因此只需要调休一天,就可以包含5天。
- 如果5月1日与2日包括了周三,例如周二,周三,或者周三,周四,那么同样只需要调休一天,分别是周一与周五,也就是调休1天,就可以包含5天。
- 如果5月1日与2日本来就是周六或者周日,那么一定可以连接为4天,因此再调休1天,就可以包含5天。
因此,可以理解为,春节现在通常休息8天(只需要调休1或者2天),劳动节通常休息5天(只需要调休1天)。
2025放假安排
一、元旦:1月1日(周三)放假1天,不调休。
二、春节:1月28日(农历除夕、周二)至2月4日(农历正月初七、周二)放假调休,共8天。1月26日(周日)、2月8日(周六)上班。
三、清明节:4月4日(周五)至6日(周日)放假,共3天。
四、劳动节:5月1日(周四)至5日(周一)放假调休,共5天。4月27日(周日)上班。
五、端午节:5月31日(周六)至6月2日(周一)放假,共3天。
六、国庆节、中秋节:10月1日(周三)至8日(周三)放假调休,共8天。9月28日(周日)、10月11日(周六)上班。
绘制日历
判断假期
通常来说,判断假期的一个好的方法是,使用chinesecalendar库,该库的使用在之前的文章有介绍,使用chinesecalendar绘制日历
其使用方法大致如下:
import chinese_calendar as cc
from datetime import date
day = date(2024, 1, 1)
on_holiday, holiday_name = cc.get_holiday_detail(day)
print(on_holiday) # 结果为:True,表明是假期
print(holiday_name) # 结果为:New Year's Day,表明是元旦
但是,截止到2024年的11月13日,该库尚未完成对2025年的更新,因此,你现在使用会提示:NotImplementedError: no available data for year 2025, only year between [2004, 2024] supported
,当然,当你看到这篇文章的时候,也许库已经完成更新了,你可以去试一试。
因此,我们现在对于2025年日历的绘制不能够使用该库,需要手动进行标注。
from datetime import date
special_holidays = [
date(2025, 1, 1),
date(2025, 1, 28),
date(2025, 1, 29),
date(2025, 1, 30),
date(2025, 1, 31),
date(2025, 2, 1),
date(2025, 2, 2),
date(2025, 2, 3),
date(2025, 2, 4),
date(2025, 4, 4),
date(2025, 4, 5),
date(2025, 4, 6),
date(2025, 5, 1),
date(2025, 5, 2),
date(2025, 5, 3),
date(2025, 5, 4),
date(2025, 5, 5),
date(2025, 5, 31),
date(2025, 6, 1),
date(2025, 6, 2),
date(2025, 10, 1),
date(2025, 10, 2),
date(2025, 10, 3),
date(2025, 10, 4),
date(2025, 10, 5),
date(2025, 10, 6),
date(2025, 10, 7),
date(2025, 10, 8)
]
special_workdays = [
date(2025, 1, 26),
date(2025, 2, 8),
date(2025, 4, 27),
date(2025, 9, 28),
date(2025, 10, 11)
]
那么,对于判断假期,如果在标记表内,就按照标记表做决定。如果不在表内,就按照常规的周一至周五是工作,周六周日为休息日决定。
def is_holiday(year, month, day):
if day == 0:
return False
today = date(year, month, day)
if today in special_holidays:
return True
if today in special_workdays:
return False
weekday = calendar.weekday(year, month, day)
return weekday == 5 or weekday == 6
绘制日历
import calendar
import matplotlib.pyplot as plt
from datetime import date
year = 2025
fig, axes = plt.subplots(3, 4, figsize=(20, 16))
for month in range(1, 13):
month_calendar = calendar.monthcalendar(year, month)
month_calendar = [['' if day == 0 else day for day in week] for week in month_calendar]
ax = axes[(month - 1) // 4, (month - 1) % 4]
ax.set_title(calendar.month_name[month], fontsize=16, weight="bold", pad=5)
table = ax.table(
cellText=month_calendar,
colLabels=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
loc="center",
cellLoc="center",
)
table.auto_set_font_size(False)
table.set_fontsize(12)
table.scale(1, 1.5)
for key, cell in table.get_celld().items():
cell.set_linewidth(0)
for i, week in enumerate(month_calendar):
for j, day in enumerate(week):
if day and is_holiday(year, month, day):
cell = table[(i + 1, j)]
cell.set_text_props(color="red")
ax.axis("off")
plt.suptitle(f"{year}", fontsize=24, weight="bold")
plt.subplots_adjust(left=0.05, right=0.95, top=0.9, bottom=0.05, hspace=0.4, wspace=0.2)
plt.show()
日历结果:
改为纵版
刚刚的日历是3行4列的,也即每行显示4个月份,总共3行,因此最终是一个横版日历。
如果我们希望要一个纵版日历,那么只需要简单进行一些调整,将其修改为4行3列即可,也就是每行显示3个月份。
import calendar
import matplotlib.pyplot as plt
from datetime import date
year = 2025
fig, axes = plt.subplots(4, 3, figsize=(16, 20))
for month in range(1, 13):
month_calendar = calendar.monthcalendar(year, month)
month_calendar = [['' if day == 0 else day for day in week] for week in month_calendar]
ax = axes[(month - 1) // 3, (month - 1) % 3]
ax.set_title(calendar.month_name[month], fontsize=16, weight="bold", pad=5)
table = ax.table(
cellText=month_calendar,
colLabels=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
loc="center",
cellLoc="center",
)
table.auto_set_font_size(False)
table.set_fontsize(12)
table.scale(1, 1.5)
for key, cell in table.get_celld().items():
cell.set_linewidth(0)
for i, week in enumerate(month_calendar):
for j, day in enumerate(week):
if day and is_holiday(year, month, day):
cell = table[(i + 1, j)]
cell.set_text_props(color="red")
ax.axis("off")
plt.suptitle(f"{year}", fontsize=24, weight="bold")
plt.subplots_adjust(left=0.05, right=0.95, top=0.92, bottom=0.05, hspace=0.5, wspace=0.3)
纵版日历结果:
观察发现
从日历中,我们可以观察发现:
- 2025年的中秋节是10月6日,因此与十一连在一起,可以放8天假。
- 增加了2天假期以后,调休问题确实有了非常大的改善,2025年只需要调休5个工作日。
- 除夕有了明确的假期以后,不再需要担心没时间在当天进行准备了,不过对于需要异地回家的人来说,可能仍需要除夕前一天的假期,才能有更充足的回家时间。
不过,假期增加,总归是好的事情。