YOGYUI

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

Software/Python

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

요겨 2024. 1. 2. 12:20
반응형

 

2024년 공휴일 크롤링 (OpenAPI)

 

2024년 갑진년(甲辰年) 새해가 밝았다

올해도 어김없이 새해맞이 공휴일을 크롤링해보자

 

OpenAPI: 공공데이터포털의 "한국천문연구원_특일 정보"

API 활용법 포스팅 링크

 

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

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

yogyui.tistory.com

 

아래와 같이 Python(파이썬) 스크립트 실행

※ API 키 획득 방법은 위의 링크 글 참고

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_2024 = getHolidayDataFrame(2024)
    
    app = QApplication([])
    app.setStyle('fusion')
    table = QTableWidget()
    table.setColumnCount(len(df_holiday_2024.columns))
    table.setHorizontalHeaderLabels(df_holiday_2024.columns)
    table.setRowCount(len(df_holiday_2024))
    table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
    table.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
    for row in range(table.rowCount()):
        record = df_holiday_2024.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_2024
Out[1]: 
             이름         날짜      요일
0          1월1일        2024-01-01  월
1            설날        2024-02-09  금
2            설날        2024-02-10  토
3            설날        2024-02-11  일
4     대체공휴일(설날)   2024-02-12  월
5           삼일절       2024-03-01  금
6        국회의원선거    2024-04-10  수
7          어린이날      2024-05-05  일
8   대체공휴일(어린이날)  2024-05-06  월
9        부처님오신날    2024-05-15  수
10          현충일       2024-06-06  목
11          광복절       2024-08-15  목
12           추석        2024-09-16  월
13           추석        2024-09-17  화
14           추석        2024-09-18  수
15          개천절       2024-10-03  목
16          한글날       2024-10-09  수
17        기독탄신일     2024-12-25  수

 

- 설날(2월 10일 토요일) 및 어린이날(5월 5일 일요일)에 대해 총 이틀의 대체공휴일 발생

- 4월 10일 국회의원 선거(총선) 이벤트

 

2024년은 총 18일의 공휴일이 예정되어 있다

 

주말(토, 일)을 제외한 공휴일을 카운트해보자

df_holiday_2024_weekday = df_holiday_2024[~df_holiday_2024['요일'].str.contains('토') & ~df_holiday_2024['요일'].str.contains('일')]
In [2]: len(df_holiday_2024_weekday)
Out[2]: 15

 

주중 공휴일은 종 15일 예정 (83.3%)

특히 추석은 월, 화, 수 휴일이라 연차를 조져주면 1주일 넘게 푹 쉴수 있다!

 

끝~!

 

반응형