한국 공휴일 데이터 이용하기(Python)

1. 공공 데이터 포털 로그인 https://www.data.go.kr/

2. 한국천문연구원_특일 정보 api 검색 https://www.data.go.kr/data/15012690/openapi.do

3. 활용신청 – 공휴일 정보 조회만 신청하면 됨

4. 마이페이지에서 API 키 확인 (일반 인증키 확인)

5. API 콜해서 사용

import json
from datetime import datetime, timedelta

import pandas as pd
import requests
from pandas import json_normalize

from const import OPEN_API_KEY

holiday_map = {}


def get_holiday_of_year_month(year: str, month: str):
    global holiday_map
    if year + month in holiday_map:
        return holiday_map[year + month]
    if len(month) != 2:
        month = month.zfill(2)
    url = f'https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo?serviceKey={OPEN_API_KEY}&solYear={year}&solMonth={month}&_type=json'
    response = requests.get(url)
    json_data = json.loads(response.text)
    holiday = json_data['response']['body']['items']
    if not holiday:
        return []
    holiday = holiday['item']
    df = json_normalize(holiday)
    df['locdate'] = pd.to_datetime(df['locdate'], format='%Y%m%d').dt.strftime('%Y/%m/%d')
    holiday_map[year + month] = df['locdate'].to_list()
    return df['locdate'].to_list()

API를 이용해서 함수를 만들어서 사용중이다. 주의할점은

  1. API 문서에도 나와있지만 default 타입은 xml이기 때문에 json으로 쓰려면 _type 파라미터 지정이 필요하다.
  2. month에서 앞에 한자리수 달인 경우 0을 붙여줘야 한다. ex) 01, 02, … 09
  3. holiday가 없는 경우가 있고, 이 경우에 json_data[‘response’][‘body’][‘items’] 가 비어있다.
  4. 20231004 같은 형태로 데이터가 나오는데, 다른형태로 가공해서 사용하려면 pd.to_datetime등을 사용해서 변경하였다.
  5. API가 반복 요청되는 것을 막기 위해 global map을 두고, API 콜 이후 데이터를 저장해서 다음번 API 콜 시에는 request를 보내지 않도록 일종의 캐시를 구현했다.