Python獲取中國日歷

在做項目排班的時候經(jīng)常會遇到一個問題,就是如何在Excel中標記中國的節(jié)假日?
經(jīng)過在網(wǎng)上找各種API,發(fā)現(xiàn)不是要錢就是服務(wù)器404,再不然就是沒有標記完全(比如只標記了節(jié)假日,但調(diào)休加班沒有)。所以,最后還是背靠度娘,通過度娘提供的數(shù)據(jù)來自己做一個帶中國節(jié)假日日歷列表。

度娘的接口

https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=2020%E5%B9%B4&resource_id=6018&format=json

可以看到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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容