Project/[2025] Heat Demand Forecasting 기록

[Python_Crawling] 공공데이터포털 : 공휴일 데이터

choidawon 2025. 5. 19. 15:50

열 수요 예측 정확도 향상을 위해 소비자의 사회적 행동 패턴에 가장 큰 영향을 주는 변수로 공휴일을 포함하기 위해
데이터포털에서 공개한 API를 활용하도록 했다.
 

1.  API 활용 신청

https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15012690
회원가입 후, 활용 신청하면 인증키가 발급이 된다.
인증키 두개가 발급이 되는데 여기선 인코딩 용 인증키를 활용했다.
 
- 서비스 URL
필요한 정보에 따라 URL 뒤에 붙여야하는 문자열(서비스 오퍼레이션)이 다르다.

서비스 종류서비스 오퍼레이션명
국경일 정보 조회getHoliDeInfo
공휴일 정보 조회getRestDeInfo
기념일 정보 조회getAnniversaryInfo
24절기 정보 조회get24DivisionsInfo
잡절 정보 조회getSundryDayInfo

 

2. 테스트 코드

import requests
import xml.etree.ElementTree as ET
from datetime import datetime
import pandas as pd

# 공공데이터포털에서 발급받은 인코딩된 서비스 키 입력
SERVICE_KEY = '  '

# 확인할 연도와 월 설정 (원하는 연도와 월로 바꾸세요)
year = 2025
month = 1

# 🔗 API URL 구성
url = (
    f"http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo"
    f"?serviceKey={SERVICE_KEY}&solYear={year}&solMonth={str(month).zfill(2)}"
)

# API 요청
response = requests.get(url)
root = ET.fromstring(response.content)

# 결과 저장 리스트
holiday_data = []

items = root.find(".//items")
if items is not None:
    for item in items.findall("item"):
        locdate = item.findtext("locdate")
        date_name = item.findtext("dateName")
        is_holiday = item.findtext("isHoliday")

        # 'Y' → 1, 'N' → 0 변환
        holiday_flag = 1 if is_holiday == 'Y' else 0

        holiday_data.append({
            "날짜": datetime.strptime(locdate, "%Y%m%d"),
            "이름": date_name,
            "공휴일여부": holiday_flag
        })

# DataFrame 생성
df_holiday = pd.DataFrame(holiday_data)
print(df_holiday)

 
공휴일이 출력됨을 확인할 수 있다.
 
기존에 있는 파일에 공휴일을 확인하는 IS_HOLIDAY 컬럼 생성 후, 다운 받기 위해 코드 구현을 해보았다.

import pandas as pd
import requests
import xml.etree.ElementTree as ET
from datetime import datetime
from google.colab import files
from google.colab import drive

# 1. 공공데이터포털 인코딩된 서비스 키 입력
SERVICE_KEY = ' '
# 2. 공휴일 데이터 가져오기 (2022~2025)
years = range(2022, 2026)
holiday_dates = []

for year in years:
    for month in range(1, 13):
        url = (
            f"http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo"
            f"?serviceKey={SERVICE_KEY}&solYear={year}&solMonth={str(month).zfill(2)}"
        )
        response = requests.get(url)
        if response.status_code != 200:
            print(f"{year}-{month} 요청 실패")
            continue

        root = ET.fromstring(response.content)
        items = root.find(".//items")
        if items is not None:
            for item in items.findall("item"):
                locdate = item.findtext("locdate")       # YYYYMMDD
                is_holiday = item.findtext("isHoliday")   # 'Y' or 'N'
                if locdate and is_holiday == 'Y':
                    holiday_dates.append(datetime.strptime(locdate, "%Y%m%d").date())

# 3. 기존 엑셀 파일 불러오기
drive.mount('/content/drive')
df = pd.read_excel("/content/drive/MyDrive/파주지사_A.I예측추가(2022~2025).xlsx")
df['Date'] = pd.to_datetime(df['일자'], errors='coerce')

# 4. 공휴일 여부 컬럼 추가 (datetime.date 비교)
df['Is_Holiday'] = df['Date'].dt.date.isin(holiday_dates).astype(int)

# 5. 파일 저장 및 다운로드
save_path = "/content/파주지사_AI예측_공휴일_API연동.xlsx"
df.to_excel(save_path, index=False)
files.download(save_path)

 
처음에는 공휴일인데도 0으로 표시되어 에러라 생각했지만, 2. 공휴일 데이터 가져오기 범위 설정이 잘못되어
적용이 안되었다는 것을 깨달았다.
 
유용하게 잘 쓰기를 !