当前位置: 首页 > article >正文

假期增加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)

纵版日历结果:

观察发现

从日历中,我们可以观察发现:

  1. 2025年的中秋节是10月6日,因此与十一连在一起,可以放8天假。
  2. 增加了2天假期以后,调休问题确实有了非常大的改善,2025年只需要调休5个工作日。
  3. 除夕有了明确的假期以后,不再需要担心没时间在当天进行准备了,不过对于需要异地回家的人来说,可能仍需要除夕前一天的假期,才能有更充足的回家时间。

不过,假期增加,总归是好的事情。


http://www.kler.cn/a/391796.html

相关文章:

  • 蔚来Java面试题及参考答案
  • Spring MVC 与 JSP 数据传输
  • 如何在算家云搭建Peach-9B-8k-Roleplay(文本生成)
  • Java的dto,和多表的调用
  • MySQL Workbench导入数据比mysql命令行慢
  • 系统架构设计师论文
  • Ai创作新风标!仅需三步,利用ai工具免费制作抖音爆款的动物融合视频(含完整的步骤)
  • 深入理解接口测试:实用指南与最佳实践5.0(二)
  • Java基础-Java多线程机制
  • 【activiti工作流源码集成】springboot+activiti+mysql+vue+redis工作流审批流集成整合业务绑定表单流程图会签驳回
  • Vim9 语法高亮syntax 在指定的缓冲区和窗口执行命令
  • Java 中的 Predicate:让判断逻辑更清晰灵活
  • 把越南语翻译成中文一般用什么翻译工具?《越南语翻译通》App或许能满足你的技术痛点需求!
  • OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示
  • 【大语言模型】ACL2024论文-09 无监督信息精细化训练用于增强大型语言模型的检索增强生成
  • 从美国大选,看软件安全风险与挑战
  • 利用阿里云下载 WebRTC 源码
  • Golang 编码(url,base64,hex,md5,sha-1)
  • 鸿蒙应用权限控制与位置服务(Location Kit)
  • LeetCode【0016】最接近的三数之和
  • EasyExcel级联下拉
  • 压缩感知:高效信号采样与重建的理论与实践
  • Paddle分布式训练报NCCL错
  • Windows 局域网IP扫描工具:IPScaner 轻量免安装
  • [产品管理-70]:四种不同的创新战略框架的比较:皮萨诺创新景观图、波特竞争战略、安索夫矩阵、马尔斯和斯诺战略框架
  • 使用Python Flask构建Web应用