Python獲取中國(guó)日歷2022版

近期又遇到了要做排班的事情,需要標(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字段,所以后面專門(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)的類型','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)容
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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