近期又遇到了要做排班的事情,需要標(biāo)記哪些日期是法定節(jié)假日屁置,本來(lái)想著把以前的記錄拿來(lái)抄作業(yè)仁连,怎奈到了2022年已然不是那個(gè)2020年的它了阱穗。
接下來(lái),放上2022年版本的日歷獲取方法昌抠。
今年的接口已經(jīng)變成了:https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?tn=wisetpl&format=json&resource_id=39043&query=2022%E5%B9%B41%E6%9C%88&t=1642579711570&cb=op_aladdin_callback1642579711570
然后獲取的結(jié)果也只有上月鲁僚、當(dāng)月、下月冰沙,且對(duì)節(jié)假日的標(biāo)記字段(status)有的月份沒(méi)有拓挥,所以處理方式有所變化,最終標(biāo)記的是否節(jié)假日僅做了較少的抽樣驗(yàn)證侥啤,嚴(yán)格來(lái)說(shuō)需要使用者自己再進(jìn)行驗(yàn)證后使用。
以下是全部代碼:
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 19 16:10:13 2022
@author: shanlin
"""
import pandas as pd
import requests
import json
import numpy as np
import re
# 生成某一年的日歷
def gen_calendar2022(year=2022):
df=pd.DataFrame()
# 獲取法定節(jié)假日
up1='https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?tn=wisetpl&format=json&resource_id=39043&query='
up2='月&t=1642579711570&cb=op_aladdin_callback1642579711570'
# 2022年接口已經(jīng)改為按月獲取數(shù)據(jù)蚁鳖,因此循環(huán)12個(gè)月獲取每月數(shù)據(jù)
for i in range(1,13):
url="".join([up1,str(year),"年",str(i),up2])
print(url)
r=requests.get(url)
rtxt=re.split("[()]", r.text)[1]
r_json=json.loads(rtxt)
each_d1=pd.DataFrame(r_json['data'])
each_d2=pd.DataFrame(each_d1['almanac'][0])
## 篩選當(dāng)月數(shù)據(jù)赁炎,數(shù)據(jù)中year\month\day是公立日期,數(shù)據(jù)會(huì)返回3個(gè)月的數(shù)據(jù)
each_d3=each_d2[each_d2['month']==str(i)]
# ## 由于12月的數(shù)據(jù)沒(méi)有status字段(可能是下一年一月放假規(guī)定沒(méi)出來(lái)琅攘,所以這里進(jìn)行特殊處理)--結(jié)論應(yīng)該是某些月份沒(méi)有節(jié)假日就沒(méi)有status字段,所以后面專(zhuān)門(mén)針對(duì)status進(jìn)行處理
# if i==11:
# each_d3=each_d2[each_d2['month']>=str(i)]
# else:
# each_d3=each_d2[each_d2['month']==str(i)]
## 組合真的日期哨查,并標(biāo)記節(jié)假日情況
each_d3['公歷日期']=pd.to_datetime(each_d3['year']+"/"+each_d3['month']+"/"+each_d3['day'])
each_d3['周幾']=each_d3['公歷日期'].dt.dayofweek+1
## 標(biāo)記是否節(jié)假日(即當(dāng)天是否是法定放假)剧辐,其中status中的1表示放假,2表示上班溉奕,注意需要處理有沒(méi)有status列的情況
## 有status的情況
if "status" in each_d3.columns:
each_d3['status'].fillna(0,inplace=True)
each_d3['status']=each_d3['status'].astype('int',errors='ignore')
## 按周幾把周末標(biāo)記成1忍啤,周一至周五標(biāo)記成0,然后通過(guò)標(biāo)記和status的值相加同波,結(jié)果為1和2的就是假期
judge=np.where(each_d3['周幾']<6,0,1)+each_d3['status']
each_d3['是否節(jié)假日']=np.where((judge==1) | (judge==2),"Y","N")
df=df.append(each_d3)
# each_d3.to_csv("百度日歷.csv",index=False)
## 沒(méi)有status的情況未檩,直接按周末為節(jié)假日
else:
each_d3['是否節(jié)假日']=np.where(each_d3['周幾']>=6,"Y","N")
df=df.append(each_d3)
# 重命名列
df.rename(columns={'animal':'生肖','avoid':'忌','cnDay':'中文星期','day':'日','gzDate':'干支日','gzMonth':'干支月','gzYear':'干支年','isBigMonth':'是否為陰歷大月','lDate':'中文陰歷日','lMonth':'中文陰歷月','lunarDate':'數(shù)字陰歷日','lunarMonth':'數(shù)字陰歷月','lunarYear':'數(shù)字陰歷年','month':'月','oDate':'陽(yáng)歷當(dāng)天0點(diǎn)','suit':'宜','term':'節(jié)氣節(jié)日','type':'各種與節(jié)日有關(guān)的類(lèi)型','value':'各種日','year':'年','desc':'一種節(jié)日','status':'1休假2上班'},
inplace=True)
return df
if __name__=="__main__":
df=pd.DataFrame()
for year in range(2010,2023):
# 注意2010年的元旦當(dāng)天并未被百度標(biāo)記為假日,所以當(dāng)年的數(shù)據(jù)可能是錯(cuò)誤的
# year=2022
each_df=gen_calendar2022(year)
df=df.append(each_df)
df.to_csv('{}年節(jié)日歷表.csv'.format(year),index=False)
以下還是懶人入口孙蒙,放了2010-2022年的數(shù)據(jù)(不過(guò)2010年元旦百度并未標(biāo)記為假日悲雳,所以這一年的是否節(jié)假日數(shù)據(jù)可能是錯(cuò)的):
地址:
https://pan.baidu.com/s/1lKTlbFGSCQYt5FczXRgI8A?pwd=h44c
提取碼: h44c
日歷表內(nèi)容