中國法定節(jié)假日API
Date: November 16, 2021
1.背景
目前業(yè)務(wù)需求中,需要分析法定節(jié)假日。我們?nèi)粘2榭捶ǘü?jié)假日,都是在百度或者某些日歷中查看。但是,網(wǎng)上很少有通過API獲得節(jié)假日的方法。因此,就自己查找資料,整理了一套腳本,獲取相關(guān)節(jié)假日。
2.相關(guān)資料查找
能夠獲取1990年至2050年法定節(jié)假日:https://blog.csdn.net/nayi_224/article/details/109068470
百度萬年歷OPENAPI(只能獲取2020年之前的,后面收費(fèi)了): https://blog.csdn.net/flyingLF/article/details/106426427
開源工具箱 ( https://tool.bitefu.net/ )
其節(jié)假日API: https://www.kancloud.cn/xiaoggvip/holiday_vip/1606900
開源工具箱的API比較可靠,可以日常使用,使用方式如下:
API地址:http://tool.bitefu.net/jiari/
請求方式:GET
請求參數(shù):d (日期/年月/年份)
返回參數(shù):請求一天,返回對應(yīng)節(jié)假日狀態(tài)(0-工作日, 1-休息日, 2-節(jié)假日)
請求示例:
1.獲取某一天的節(jié)假日狀態(tài):http://tool.bitefu.net/jiari/?d=20111001
返回結(jié)果: 2
2.獲取某月的節(jié)假日:http://tool.bitefu.net/jiari/?d=202110
返回結(jié)果: {"202110":{"1001":2,"1002":2,"1003":2,"1004":1,"1005":1,"1006":1,"1007":1}}
2.獲取多月的節(jié)假日:http://tool.bitefu.net/jiari/?d=202110,202111
返回結(jié)果: {"202110":{"1001":2,"1002":2,"1003":2,"1004":1,"1005":1,"1006":1,"1007":1},"202111":false}
3.獲取某年的節(jié)假日:http://tool.bitefu.net/jiari/?d=2010
返回結(jié)果: 與月的接口類似
3.相關(guān)腳本開發(fā)
3.1 解析json數(shù)據(jù)腳本
以下腳本內(nèi)容,通過開源 REST API,對結(jié)果進(jìn)行json解析,得到節(jié)假日數(shù)據(jù)。
# -*- coding: utf-8 -*-
#python 代碼解析法定節(jié)假日json
#導(dǎo)入請求包
import requests
#導(dǎo)入json包
import json
#導(dǎo)入系統(tǒng)包
import sys
def get_state_legal_holiday(cur_year,file_path):
DATE_URL="https://tool.bitefu.net/jiari/?d=%s" % (cur_year)
result=requests.get(DATE_URL)
if result.status_code != 200 :
sys.exit(-1) #報(bào)錯(cuò)退出
else:
dict_data=result.json()
for year_key in dict_data.keys():
dict_days=dict_data.get(year_key) #根據(jù)key,獲取對應(yīng)的節(jié)假日
if dict_days == False: # false 的情況數(shù)據(jù)無法獲取
print("===>當(dāng)前年份 【%s】數(shù)據(jù)不存在,跳過" % year_key)
continue
else :
print("===>當(dāng)前年份 【%s】數(shù)據(jù)存在,詳細(xì)數(shù)據(jù)如下:%s " % (year_key,dict_days) )
for day_key in dict_days.keys():
day_status=dict_days.get(day_key) #節(jié)假日狀態(tài): 0-工作日, 1-休息日, 2-節(jié)假日,這里獲取的休日實(shí)際是調(diào)休的節(jié)假日
day_res=(str(year_key)+day_key ) +',' + str(year_key)+',' + str(day_status) + '\n'
with open(file_path,'a',encoding='utf-8') as file:
file.write(day_res) #csv對應(yīng)字段: f_date_id,f_year_id,f_status
def main():
if(len(sys.argv)<3): #參數(shù)不足,默認(rèn)參數(shù)是腳本本身,傳參下標(biāo)從1開始
print('USAGE ERROR,PLEASE USE LIKE THIS: PYTH_SCRIPT_PATH START_YEAR END_YEAR [RESULT_FILE_PATH]' )
sys.exit(-1)
elif(len(sys.argv)==3): # 傳遞2個(gè)參數(shù),start_year,end_year
start_year=int(sys.argv[1])
end_year=int(sys.argv[2])
result_file_path="./state_holiday.csv"
else: #傳遞3個(gè)參數(shù),start_year,end_year,result_file_path
start_year=int(sys.argv[1])
end_year=int(sys.argv[2])
result_file_path=sys.argv[3]
print("===>相關(guān)參數(shù):起始年份(包含):%s ,截至年份(包含):%s ,數(shù)據(jù)存儲路徑:%s " % (str(start_year),str(end_year),result_file_path))
for cur_year in range(start_year,end_year+1):
print('====> cur_year=%s' % str(cur_year))
get_state_legal_holiday(cur_year,result_file_path)
if __name__ == '__main__' :
main()
3.2 數(shù)據(jù)更新的腳本
以下腳本,T+1 執(zhí)行,調(diào)用JSON解析腳本,獲得結(jié)果數(shù)據(jù),并寫入對應(yīng)表中。文章來源:http://www.zghlxwxcb.cn/news/detail-448395.html
#!/bin/bash
##國家法定節(jié)假日查詢更新
export HADOOP_USER_NAME=bigdata
if [ $# -eq 0 ]; then
current_year=$(date +'%Y')
begin_year=${current_year}
end_year=${current_year}
elif [ $# -eq 1 ]; then
begin_year=$1
end_year=$1
elif [ $# -eq 2 ]; then
begin_year=$1
end_year=$2
else
echo "USAGE: $0 begin_year end_year"
exit 0
fi
CUR_TIMESTAMP=$(date +'%s')
#命令配置
BEELINE_CMD="beeline -u jdbc:hive2://node01:10000 -n bigdata "
IMPALA_CMD="impala-shell -i node02:25003 -u bigdata "
WORK_DIR=$PWD/dwd_risk_data_day_flow
#數(shù)據(jù)HIVE存在狀態(tài)(默認(rèn)為0,不存在)
CHECK_STATUS=0
#查驗(yàn)hive中是否存在該年度數(shù)據(jù)
function check_year_data_exist(){
CUR_YEAR=$1
CHECK_SQL="SELECT COUNT(*) CNT FROM dw.dim_state_legal_holiday where f_year_id='${CUR_YEAR}' ;"
YEAR_DATA_CNT=$( $IMPALA_CMD -B -q "${CHECK_SQL}" )
if [ $? -ne 0 ];then echo "there is an error!" ; exit 1 ; fi
if [ ${YEAR_DATA_CNT} -gt 0 ];then
echo "===>當(dāng)前年度【${CUR_YEAR}】的節(jié)假日數(shù)據(jù)已存在,為防請求過多導(dǎo)致IP攔截,不進(jìn)行請求"
CHECK_STATUS=1
else
CHECK_STATUS=0
fi
}
function update_holiday_data(){
cur_year="$1"
RESULT_FILE="state_holiday-${cur_year}.csv"
RESULT_PATH=$WORK_DIR/$RESULT_FILE
HDFS_LOAD_PATH="/tmp/bigdata/${RESULT_FILE}"
/opt/anaconda3/bin/python ${WORK_DIR}/state_legal_holiday_parse.py ${cur_year} ${cur_year} "${RESULT_PATH}"
if [ $? -ne 0 ];then echo "there is an error!" ; exit 1 ; fi
hdfs dfs -rm -f ${HDFS_LOAD_PATH}
hdfs dfs -put ${RESULT_PATH} ${HDFS_LOAD_PATH}
LOAD_DATA_SQL="LOAD DATA INPATH '${HDFS_LOAD_PATH}' OVERWRITE INTO TABLE tmp.dim_state_legal_holiday ; "
$BEELINE_CMD -e "${LOAD_DATA_SQL}"
if [ $? -ne 0 ];then echo "there is an error!" ; exit 1 ; fi
UPDATE_DATA_SQL="
REFRESH tmp.dim_state_legal_holiday ;
REFRESH dw.dim_state_legal_holiday ;
INSERT OVERWRITE TABLE dw.dim_state_legal_holiday
select
f_date_id,
f_year_id,
f_status
from
(
SELECT
f_date_id,
f_year_id,
f_status,
row_number() over(partition by f_date_id order by f_date_id ) rank
FROM
(
--增量數(shù)據(jù)
select
f_date_id,
f_year_id,
f_status
from tmp.dim_state_legal_holiday
union all
--原有數(shù)據(jù)
select
f_date_id,
f_year_id,
f_status
from dw.dim_state_legal_holiday
) t
) p
where rank=1
;
"
$IMPALA_CMD -q "${UPDATE_DATA_SQL}"
if [ $? -ne 0 ];then echo "there is an error!" ; exit 1 ; fi
}
function main(){
for((cur_year=${begin_year};cur_year<=${end_year};cur_year++));
do
check_year_data_exist ${cur_year}
if [ ${CHECK_STATUS} -eq 1 ];then
continue
fi
update_holiday_data ${cur_year}
done
}
main
exit 0
如有用處,煩請點(diǎn)贊收藏^_^文章來源地址http://www.zghlxwxcb.cn/news/detail-448395.html
到了這里,關(guān)于大數(shù)據(jù)基礎(chǔ)數(shù)據(jù)之中國法定節(jié)假日API的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!