python实现获取全年所有的休息日、节假日

之前做过一个小的需求 需要每年最后一个月更新出明年的所有休息日和节假日,包括具体的时间
在这里插入图片描述
上图所展示的便是结果
因为python calendar可以获得节假日的具体时间和日期 但是显示出来的文本却是英文,并且不能够确定调休假等等这种,所以需要使用python爬取百度的日历数据,并且结合calendar库 和 翻译库进行出来
话不多说 直接上代码

需要声明一点 就是我们在使用翻译库的时候 个人建议使用pygtans这个库会好点,因为会翻译的更为准确一点 比如National Day为国庆节但是 translate库会翻译错误 亲测

# 导入所需要的库
import holidays
import datetime
import requests
import json
import pandas as pd
from translate import Translator
from pygtrans import Translate

holidays_ = holidays.CN(years=2023)
print(holidays_)
chinese = []
for i in holidays_.values():
    if '(' in i:
        i = i.split('(')[1].split(')')[0]
        chinese.append(i)
    else:
        chinese.append(i)
legal_holiday = []

chinese_ = []
for y in chinese:
    chinese_.append(Translate().translate(y).translatedText)
for i in holidays_.keys():
	legal_holiday.append(i)
dict_ = {}
for i in range(len(legal_holiday)):
    dict_[legal_holiday[i]] = chinese_[i]
print(dict_)

# 从百度的php接口中获取到数据
def catch_url_from_baidu(calcultaion_year, month):
    headers = {
        "Content-Type": "application/json;charset=UTF-8"
    }
    param = {
        "query": calcultaion_year + "年" + month + "月",
        "resource_id": "39043",
        "t": "1604395059555",
        "ie": "utf8",
        "oe": "gbk",
        "format": "json",
        "tn": "wisetpl",
        "cb": ""
    }
    # 抓取位置:百度搜索框搜索日历,上面的日历的接口,可以在页面上进行核对
    r = requests.get(url="https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php",
                     headers=headers, params=param).text
    # print(r)
    month_data = json.loads(r)["data"][0]["almanac"]
    not_work_day = []
    for one in month_data:
        if (one["cnDay"] == '日' or one["cnDay"] == '六'):
            if ('status' in one):
                if (one["status"] == "2"):
                    # status为2的时候表示周末的工作日,百度日历上会有班标志的数据
                    continue
                else:
                    # 普通周末时间
                    not_work_day.append(one)
                    continue
            else:
                # 普通周末时间。(接口中,如果左上角没有特殊表示,则不会返回status)
                not_work_day.append(one)
                continue
        if ('status' in one and one["status"] == "1"):
            # status为1的时候表示休息日,百度日历上会有休标志的数据
            not_work_day.append(one)
    a = print_info(not_work_day)
    return a
    # print_info(not_work_day)


def print_info(not_work_day):
	date_ = []
	for one in not_work_day:
		template_ = f"({one['year']},{one['month']},{one['day']})"
		date_.append(template_)
	return date_


if __name__ == '__main__':
    calcultaion_year = "2023"
    # 因该接口传入的时间,查询了前一个月,当前月和后一个月的数据,所以只需要2、5、8、11即可全部获取到。比如查询5月份,则会查询4,5,6月分的数据
    calculation_month = ["2", "5", "8", "11"]
    date_ = []
    for one_month in calculation_month:
        date_.append(catch_url_from_baidu(calcultaion_year, one_month))
    def sum_list(arg):
    	return sum(arg, [])
    date_ = sum_list(date_)
    # date_ = [y for y in i for i in date_]
    time_ = []
    for i in date_:
    	i = i.replace('(','')
    	i = i.replace(')','')
    	i = list(map(int, i.split(',')))
    	time_.append(datetime.date(i[0],i[1],i[2]))
    df = pd.DataFrame(time_, columns=['时间'])
    def cer_(x):
    	if x in legal_holiday:
    		return dict_[x]
    	else:
    		return '休息日'
    df['类别'] = df['时间'].apply(cer_)
    df.to_excel('日历数据.xlsx',index=False)

在这里插入图片描述
输出结果
在这里插入图片描述
在这里插入图片描述
上面所说的状态 指的就是这个左上角的 班 和 休字的日期和时间 如有更好的方法 欢迎讨论

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
引用和引用[2]提供了获取节假日和工作日的方法。根据这些方法,你可以使用chinese_calendar库来获得指定时间范围内的节假日。 首先,你需要导入相关的库和模块,具体如引用所示。然后,你可以指定开始时间和结束时间,例如引用中的start_time和end_time。 接下来,你可以使用chinese_calendar.get_holidays方法来获取节假日的日期,并将其存储在一个DataFrame中,如引用中的hd。你还可以使用chinese_calendar.get_workdays方法来获取工作日的日期,并将其存储在另一个DataFrame中,如引用中的workdays。 最后,你可以根据用户的输入,遍历节假日的DataFrame,找到相应的序号对应的节假日信息,并输出相应的节假日名称和假期范围。 以下是一个示例代码,展示了如何实现上述功能: ```python import chinese_calendar import datetime import pandas as pd start_time = datetime.date(2021, 1, 1) end_time = datetime.date(2022, 6, 30) hd = pd.DataFrame(chinese_calendar.get_holidays(start_time, end_time)) hd = hd.rename(columns={0:'日期'}) hd['属性'] = '假期' workdays = pd.DataFrame(chinese_calendar.get_workdays(start_time, end_time)) workdays = workdays.rename(columns={0:'日期'}) workdays['属性'] = '工作日' ls = [] for line in hd.values: ls.append(line) s = input("请输入节假日序号:").split(" ") while True: flag = False for i in s: for line in ls: if i == line[1]: print("{}({})假期是{}月{}日至{}月{}日之间".format(line[3], line[1], line[2][:2], line[2][2:], line[4][:2], line[4][2:])) flag = True if not flag: print("输入节假日序号有误!") s = input("请输入节假日序号:").split(" ") ``` 注意,以上代码只是一个示例,你需要根据实际情况进行调整和修改。另外,为了运行以上代码,你可能还需要安装chinese_calendar库。 希望这能帮到你!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vergil_Zsh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值