본문 바로가기
실무/공휴일 정보 자동으로 활용하기

파이썬으로 대한민국 공휴일 정보 csv로 받기, 활용하기

by davi_kr 2023. 3. 30.

목차

    반응형

    [대한민국 공휴일 정보 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를 생성하고 참고합니다.

    반응형

    댓글