YOGYUI

2023년 공휴일을 알아보자 (공공데이터포털 OpenAPI) 본문

Software/Python

2023년 공휴일을 알아보자 (공공데이터포털 OpenAPI)

요겨 2022. 12. 31. 23:51
반응형

 

2023년 공휴일 크롤링 (OpenAPI)

 

2022년이 저물어간다

매년 새해가 밝아오면 가장 먼저 하는 일은 역시 공휴일 확인 (직장인의 유일한 낙이랄까)

 

공공데이터포털의 "한국천문연구원_특일 정보" Open API를 사용해서 다가오는 2023년의 공휴일 정보를 가져와보자 (원래 노는 토/일 주말은 제외~)

API 활용 포스트 링크

 

공공데이터포털::공휴일 데이터 조회 (REST API)

회사에서 사원별 공수(Man Hour) 관리 프로그램을 하나 만들었는데, 공휴일에는 입력이 안되게 만드는 기능이 필요하게 됐다 파이썬 써드파티 라이브러리 종류도 몇 개 있어 찾아봤는데, 중국의

yogyui.tistory.com

파이썬 코드로 매년 초 한번씩 정보를 가져와서 DB에 저장하는 자동화 코드를 개발해두면 여기저기 요긴하게 사용할 수 있다 (주식 매매, 업무 이력 관리 등등)

[Python code]

import datetime
import requests
import pandas as pd
from bs4 import BeautifulSoup, element
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def getHolidayDataFrame(year: int) -> pd.DataFrame:
    url = "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo"
    api_key_encoded = "Your key from data.go.kr"
    api_key_decoded = requests.utils.unquote(api_key_encoded, encoding="utf-8")
    
    params = {
        "ServiceKey": api_key_decoded,
        "solYear": year,
        "numOfRows": 100
    }
    
    weekday_name = ["월", "화", "수", "목", "금", "토", "일"]
    
    response = requests.get(url, params=params)
    xml = BeautifulSoup(response.text, "lxml")
    
    def parseItem(item: element.Tag) -> dict:
        dt = datetime.datetime.strptime(item.find("locdate").text.strip(), '%Y%m%d')
        item_dict = {
            "이름": item.find("datename").text.strip(),
            "날짜": dt,
            "요일": weekday_name[dt.weekday()]
        }
        return item_dict
    
    item_list = [parseItem(x) for x in xml.find("items")]
    return pd.DataFrame(item_list)

if __name__ == "__main__":
    df_holiday_2023 = getHolidayDataFrame(2023)
    
    app = QApplication([])
    app.setStyle('fusion')
    table = QTableWidget()
    table.setColumnCount(len(df_holiday_2023.columns))
    table.setHorizontalHeaderLabels(df_holiday_2023.columns)
    table.setRowCount(len(df_holiday_2023))
    table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
    table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
    for row in range(table.rowCount()):
        record = df_holiday_2023.iloc[row]
        item = QTableWidgetItem(record['이름'])
        table.setItem(row, 0, item)
        item = QTableWidgetItem(record['날짜'].strftime('%Y-%m-%d'))
        item.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
        table.setItem(row, 1, item)
        weekday = record['요일']
        item = QTableWidgetItem(weekday)
        item.setTextAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
        if weekday in ['토', '일']:
            item.setForeground(QBrush(Qt.red))
        table.setItem(row, 2, item)
    table.show()
    app.exec()

 

[실행 결과]

In [1]: df_holiday_2023
Out[1]: 
        이름        날짜    요일
0      1월1일    2023-01-01  일
1       설날     2023-01-21  토
2       설날     2023-01-22  일
3       설날     2023-01-23  월
4    대체공휴일  2023-01-24  화
5      삼일절    2023-03-01  수
6     어린이날   2023-05-05  금
7   부처님오신날 2023-05-27  토
8      현충일    2023-06-06  화
9      광복절    2023-08-15  화
10      추석     2023-09-28  목
11      추석     2023-09-29  금
12      추석     2023-09-30  토
13     개천절    2023-10-03  화
14     한글날    2023-10-09  월
15   기독탄신일  2023-12-25  월

대체공휴일은 1월 22일 일요일 구정 대상으로 하루만 발생

총 16일의 공휴일이 예정되어 있다

 

이 중 주말(토, 일)을 제외하면

df_holiday_2023_weekday = df_holiday_2023[~df_holiday_2023['요일'].str.contains('토') & ~df_holiday_2023['요일'].str.contains('일')]
In [2]: len(df_holiday_2023_weekday)
Out[2]: 11

주중 공휴일은 총 11일 예정

 

1월 1일 신정은 국경일이 아니므로 대체공휴일이 적용되지 않는다

또한 대체공휴일은 석/추석 연휴, 어린이날, 3.1절, 광복절, 개천절, 한글날만을 대상으로 했는데, 2023년부터는 석가탄신일과 성탄절도 도입될 가능성이 있다 (2023년 경제정책방향 - 지역경제 활성화와 여가관 보장을 위한 대체공휴일 지정 확대 추진 계획)

https://www.joongang.co.kr/article/25127117#home

 

여당, 성탄절·석가탄신일 대체공휴일 제안…"정부도 긍정적" | 중앙일보

20일 정부에 공식 제안했다.

www.joongang.co.kr

 

https://www.korea.kr/news/visualNewsView.do?newsId=148909829&pWise=sub&pWiseSub=B2

 

끝~!

반응형