목차
반응형
[대한민국 공휴일 정보 csv로 받기, 활용하기]
서비스 특성 상, 공휴일 정보를 활용할 일이 많았습니다.
매번 api를 호출하다가 이것도 시간 소요가 있어서 csv 형태로 받아두고 csv를 호출해서 보는게 좋겠단 생각이 들었습니다.
공휴일 정보는 그 해가 시작되면 수정될 일이 없고 수정되어야 하면 뉴스 등을 통해 알게 되니 그때만 한번 고쳐주면 되기 때문에 이 정도면 충분하겠다 생각했습니다.
이렇게 해두면 23년, 24년, 25년, 26년 쭉 가더라도 자동으로 관리가 가능하고 각 년마다의 1월, 2월, 3월, 4월, 5월, 6월, 7월, 8월, 9월, 10월, 11월, 12월에 대한 공휴일 정보도 바로 확인이 가능합니다.
import requests
import json
from pandas import json_normalize
#공공데이터 포털에서 가져온 api 키, https://www.data.go.kr/
mykey = "개인 인증키를 입력해주세요!"
#한국 공휴일 csv 생성하고 생성 여부를 반환하는 함수
def korean_holiday_csv_maker(year):
url = (
"http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?_type=json&numOfRows=50&solYear="
+ str(year)
+ "&ServiceKey="
+ str(mykey)
)
response = requests.get(url)
#정상적으로 정보를 받아오면 받아온 공휴일 정보를 csv로 저장
if response.status_code == 200:
json_ob = json.loads(response.text)
holidays_data = json_ob["response"]["body"]["items"]["item"]
dataframe = json_normalize(holidays_data)
dataframe.to_csv('{}_Korean_holiday.csv'.format(year))
print('생성 성공!')
return True
print('생성 실패!')
return False
korean_holiday_csv_maker(2023)
[특정 요일이 공휴일인지 확인하는 함수]
위에서 csv를 생성하면 같은 경로에 holiday_checker 함수를 통해 특정 날짜가 휴일인지를 체크합니다.
체크한 결과를 dict 형태로 반환하며 holiday_yn이 True면 휴일이고 day는 날짜를 검증하는 차원에서 무슨 요일인지만 알려줍니다.
from datetime import datetime
import pandas as pd
import os
today = datetime.now()
#특정일의 공휴일 여부와 요일명을 담아둔 dict를 반환하는 함수
def holiday_checker(date=today):
year = date.year
day_of_week = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]
date_strf = date.strftime("%Y%m%d")
result = True
#특정년도의 한국 공휴일 csv가 있는지 체크하고 없다면 해당년도의 공휴일을 csv로 생성
if not os.path.exists("{}_Korean_holiday.csv".format(year)):
korean_holiday_csv_maker(year)
try:
#특정년도의 한국 공휴일 csv를 읽어서 holiday_df로 생성
holiday_df = pd.read_csv('{}_Korean_holiday.csv'.format(year), index_col=0)
# print(holiday_df)
except:
print('holiday_df가 생성되지 않은 것 같습니다! csv 파일이 있는지 확인해주세요.')
# 공휴일 df에서 오늘 날짜에 해당하는 df만 남긴 dateName을 선언
dateName = holiday_df.loc[holiday_df["locdate"] == int(date_strf), "dateName"]
#공휴일 여부와 요일명을 담는 check_dict 선언
check_dict = {"holiday_yn": False}
if not dateName.empty:
check_dict['holiday_yn']= True
check_dict['day'] = day_of_week[date.weekday()]
return check_dict
print(holiday_checker())
holiday_checker 함수만 사용하면 그 안에 기존에 생성해둔 holiday csv가 있는지 없는지 유무에 따라 신규 holiday csv 파일을 생성하고 생성된 파일을 활용하는 구조입니다.
2023년 공휴일, 2024년 공휴일, 2025년 공휴일 해가 변해도 만약에 holiday_checker함수에 인자를 주지 않으면 알아서 today를 잡아줘서 오늘의 년도를 자동으로 반영하여 csv를 생성하고 참고합니다.
반응형
댓글