在做項目排班的時候經(jīng)常會遇到一個問題,就是如何在Excel中標記中國的節(jié)假日?
經(jīng)過在網(wǎng)上找各種API,發(fā)現(xiàn)不是要錢就是服務(wù)器404,再不然就是沒有標記完全(比如只標記了節(jié)假日,但調(diào)休加班沒有)。所以,最后還是背靠度娘,通過度娘提供的數(shù)據(jù)來自己做一個帶中國節(jié)假日日歷列表。
度娘的接口
可以看到query對應(yīng)的值就是你要查詢的年月對應(yīng)的日歷。這里有個好處就是,返回的數(shù)據(jù)會包含當年的所有節(jié)假日和調(diào)休加班日,如下:

image.png
所以,可以在holiday的list中看到當年所有的放假和調(diào)休加班(放假對應(yīng)的status是1,而調(diào)休加班則是2),再結(jié)合日歷本身的周六周日,就可以對當年所有的日期進行標記,最終輸出某一天是法定放假還是法定上班了。
以下是,所有代碼
以下是對小白的操作
- 用法就是,復(fù)制這些文本
- 在本地存儲為任意一個text文檔
- 將此文檔的后綴名由".txt"修改為".py"
- 然后使用python運行此文件
- 要修改年份,只需要調(diào)整最后的year=2020這個代碼就可以了
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 8 17:18:15 2020
@author: 西湖味精三月鮮
"""
# 百度獲取日歷
# https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=2020%E5%B9%B4&resource_id=6018&format=json
import pandas as pd
import requests
import json
import numpy as np
# 生成某一年的日歷
def gen_calendar(year=2020):
# 生成日歷列表
start_date=str(year)+'0101'
end_date=str(year)+'1231'
df=pd.DataFrame()
dt=pd.date_range(start_date, end_date,freq='1D')
df['date']=dt
# 計算周幾
df['dayofweek']=df['date'].dt.dayofweek+1
# 獲取法定節(jié)假日
up1='https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query='
up2='%E5%B9%B4&resource_id=6018&format=json'
url="".join([up1,str(year),up2])
r=requests.get(url)
r_json=json.loads(r.text)
# 獲取放假信息
h_data=r_json['data'][0]['holiday']
h_df=pd.DataFrame()
for i in range(len(h_data)):
each_d=h_data[i]['list']
each_df=pd.DataFrame(each_d)
h_df=h_df.append(each_df)
# 處理一下數(shù)據(jù),去重等等
h_df.drop_duplicates(inplace=True)
h_df.reset_index(drop=True,inplace=True)
h_df['date']=pd.to_datetime(h_df['date'])
# 合并數(shù)據(jù)
df2=pd.merge(df,h_df,how='left',on='date')
df2.fillna(0,inplace=True)
df2['status']=df2['status'].astype('int')
# 返回是否假日
judge=np.where(df2['dayofweek']<6,0,1)+df2['status']
judge=np.where((judge==2) | (judge==1),'Y','N')
df2['isholiday']=judge
return df2
in __name__=="__main__":
year=2020
df=gen_calendar(year)
df2.to_csv('{}年節(jié)日歷表.csv'.format(year),index=False)
以下是懶人入口,2011-2020年的都在這里
- 只有2011年及之后年份的數(shù)據(jù)
- 只有國務(wù)院公布了放假安排后,才會有當年的數(shù)據(jù),比如現(xiàn)在就沒有2021年的
- dayofweek是星期幾
- status是放假安排的判斷,1表示法定放假,2表示法定上班,0沒有特殊意義
- isholiday就是最后的結(jié)果了,Y表示是法定節(jié)假日,N表示是要上班的日子
- 下載鏈接:
鏈接:https://pan.baidu.com/s/1M1ehYSAVoLt-WvHlf4EM4Q 提取碼:s7wm

image.png