파이썬으로 오늘이 공휴일·주말인지 판별하기: pytimekr와 datetime 실전 가이드
TL;DR — pytimekr와 datetime을 조합해 한국 공휴일과 주말을 정확히 판별하는 방법을 단계별 예제와 함께 정리했습니다. 배치 작업 스케줄링에 바로 쓸 수 있는 영업일 판단 로직까지 다룹니다.
왜 "오늘이 영업일인가?"를 코드로 판단해야 할까
배치 작업이나 자동화 스크립트를 만들다 보면 의외로 자주 부딪히는 요구사항이 있습니다. "주말과 공휴일에는 실행하지 말 것" 또는 "영업일에만 알림을 보낼 것" 같은 조건입니다.
주말 판별은 비교적 쉽습니다. datetime만으로 토요일·일요일을 가려낼 수 있으니까요. 문제는 공휴일입니다. 설날·추석은 음력 기준이라 매년 양력 날짜가 바뀌고, 대체공휴일·임시공휴일까지 고려하면 직접 날짜 목록을 관리하는 건 사실상 유지보수 지옥입니다.
이럴 때 한국 공휴일을 알아서 계산해 주는 pytimekr 라이브러리와 표준 라이브러리 datetime을 조합하면, 단 몇 줄로 "오늘이 쉬는 날인지 일하는 날인지"를 판별할 수 있습니다. 이 글에서는 설치부터 실무에 바로 적용 가능한 영업일 판단 함수까지 순서대로 살펴봅니다.
1. pytimekr 설치
pytimekr는 한국의 법정 공휴일을 계산해 주는 가벼운 라이브러리입니다. 터미널(또는 cmd)에서 pip로 설치합니다.
# 터미널에서 실행
pip install pytimekr
가상환경을 쓴다면 활성화한 뒤 설치하는 것을 권장합니다. 의존성이 거의 없어 설치는 금방 끝납니다.
2. 한국 공휴일 목록 조회
설치가 끝났다면 공휴일 목록을 가져와 봅니다. holidays() 함수는 해당 연도의 공휴일을 datetime.date 객체 리스트로 돌려줍니다.
from pytimekr import pytimekr
# 올해 공휴일 목록을 받아온다 (date 객체 리스트)
holiday_list = pytimekr.holidays()
for d in holiday_list:
print(d) # 예: 2026-01-01, 2026-03-01 ...
특정 연도를 지정하고 싶다면 인자로 연도를 넘기면 됩니다.
from pytimekr import pytimekr
# 2026년 공휴일만 조회
holidays_2026 = pytimekr.holidays(year=2026)
print(f"2026년 공휴일 수: {len(holidays_2026)}일")
참고: 반환값은 문자열이 아니라
date객체입니다. 뒤에서 오늘 날짜와 비교할 때 이 타입 차이를 꼭 기억해야 합니다.
3. datetime으로 오늘 날짜와 요일 다루기
이제 표준 라이브러리 datetime으로 현재 날짜와 요일을 구합니다.
오늘 날짜 문자열로 얻기
from datetime import datetime
now = datetime.now()
# "YYYY-MM-DD" 형식의 문자열로 변환
today_str = now.strftime("%Y-%m-%d")
print(today_str) # 예: 2026-06-18
요일 숫자로 얻기
weekday() 메서드는 요일을 0~6 사이의 정수로 반환합니다.
from datetime import datetime
now = datetime.now()
weekday_num = now.weekday()
print(weekday_num)
요일 숫자의 의미는 다음과 같습니다.
| 숫자 | 요일 |
|---|---|
| 0 | 월요일 |
| 1 | 화요일 |
| 2 | 수요일 |
| 3 | 목요일 |
| 4 | 금요일 |
| 5 | 토요일 |
| 6 | 일요일 |
즉 weekday_num >= 5이면 주말이라는 뜻입니다. (참고로 isoweekday()는 월=1, 일=7로 다르게 셉니다. 두 메서드를 섞어 쓰면 버그가 나기 쉬우니 하나로 통일하세요.)
4. 주말·공휴일 통합 판별 로직
이제 두 정보를 합쳐 "오늘이 쉬는 날인지"를 판별합니다. 핵심은 타입을 맞춰서 비교하는 것입니다.
from datetime import datetime
from pytimekr import pytimekr
now = datetime.now()
weekday_num = now.weekday() # 0~6 (월~일)
today = now.date() # date 객체로 변환
# 올해 공휴일 목록 (date 객체 리스트)
holiday_list = pytimekr.holidays()
# 오늘이 공휴일 목록에 들어있는지 확인
is_holiday = today in holiday_list
# 주말(토=5, 일=6)이거나 공휴일이면 쉬는 날
if weekday_num >= 5 or is_holiday:
print("쉬는 날")
else:
print("영업일")
원문에서는 날짜를 문자열로 변환한 뒤 str(i)로 일일이 비교했지만, date 객체끼리 직접 비교하면 in 연산자 한 줄로 끝납니다. 코드가 짧아지고 변환 과정에서 생길 수 있는 포맷 불일치 버그도 사라집니다.
5. 실무용 영업일 판단 함수로 다듬기
실제 프로젝트에서는 위 로직을 함수로 캡슐화해 두면 재사용하기 좋습니다. 임의의 날짜에 대해서도 판단할 수 있도록 인자를 받게 만들었습니다.
from datetime import datetime, date
from pytimekr import pytimekr
def is_business_day(target: date | None = None) -> bool:
"""주어진 날짜(기본값=오늘)가 영업일이면 True, 주말·공휴일이면 False."""
if target is None:
target = datetime.now().date()
# 토요일(5)·일요일(6)이면 영업일 아님
if target.weekday() >= 5:
return False
# 해당 연도의 공휴일과 비교
holidays = pytimekr.holidays(year=target.year)
if target in holidays:
return False
return True
# 사용 예시
if is_business_day():
print("오늘은 업무를 처리합니다.")
else:
print("오늘은 쉬는 날이므로 작업을 건너뜁니다.")
# 특정 날짜도 검사 가능
check = date(2026, 1, 1)
print(f"{check} 영업일 여부: {is_business_day(check)}")
이렇게 함수로 만들어 두면 스케줄러(예: APScheduler, cron)에서 작업 실행 전 가드로 호출하거나, 청구·정산 같은 영업일 기준 로직에 그대로 끼워 넣을 수 있습니다.
6. 흔한 실수와 엣지케이스
실무에서 이 로직을 쓸 때 자주 만나는 함정들을 정리했습니다.
- 타입 불일치:
pytimekr.holidays()가 돌려주는 건date객체입니다. 오늘 날짜를strftime으로 문자열로 바꿔 비교하면, 한쪽은 문자열·한쪽은 객체라 영원히 일치하지 않을 수 있습니다. 비교 전 양쪽 타입을 통일하세요. - 연도 경계 문제:
holidays()는 기본적으로 현재 연도만 반환합니다. 미래 날짜나 작년 날짜를 판별할 때는 반드시year인자를 넘겨야 합니다. - 대체공휴일·임시공휴일: 라이브러리 버전에 따라 대체공휴일 반영이 다를 수 있습니다. 정산처럼 정확성이 중요한 곳이라면
pip install -U pytimekr로 최신 버전을 유지하고, 중요한 날짜는 한 번 출력해 직접 검증하세요. - 타임존:
datetime.now()는 서버 로컬 타임존을 따릅니다. 해외 리전 서버라면 자정 무렵에 날짜가 어긋날 수 있으니, 한국 기준이 필요하면zoneinfo로Asia/Seoul을 명시하는 것이 안전합니다.
from datetime import datetime
from zoneinfo import ZoneInfo
# 한국 시간 기준으로 오늘 날짜 확정
seoul_now = datetime.now(ZoneInfo("Asia/Seoul"))
print(seoul_now.date())
- 변수 오타 주의: 원문 예제의
hoilday처럼 오타가 굳어버린 변수명은 협업 시 혼란을 줍니다.is_holiday처럼 의미가 분명하고 철자가 정확한 이름을 쓰세요.
7. 요약
- 주말 판별은
datetime의weekday()로 충분합니다 (5·6이 토·일). - 한국 공휴일은
pytimekr.holidays()가date리스트로 제공합니다. - 비교는 문자열 변환 없이
date객체끼리in연산으로 처리하는 것이 가장 깔끔합니다. - 실무에서는
is_business_day()같은 함수로 캡슐화하고, 연도 인자와 타임존을 명시해 엣지케이스를 막으세요.
이 패턴 하나면 배치 스케줄링, 정산, 알림 발송 등 "영업일에만 동작해야 하는" 거의 모든 자동화에 대응할 수 있습니다.
AI에게 물어볼 때 (프롬프트 팁)
공휴일·영업일 처리는 요구사항에 따라 변형이 많아 AI에게 코드를 부탁할 때 조건을 구체적으로 명시할수록 결과가 좋아집니다. Prompt Architect 식으로 표현하면, 입력·출력·제약·예외를 한 번에 담는 것이 핵심입니다.
프롬프트 1 — 요구사항 명세형
"파이썬에서
pytimekr와datetime을 사용해, 임의의 날짜를 받아 한국 기준 영업일이면 True를 반환하는 함수를 작성해줘. 타임존은Asia/Seoul로 고정하고, 공휴일은 해당 연도 기준으로 조회하며,date객체끼리 비교해줘. 타입 검사와 docstring도 포함해줘."프롬프트 2 — 디버깅형
"아래 코드에서 오늘이 분명 공휴일인데 항상 '영업일'로 나와. 원인을 타입 관점에서 진단하고 수정안을 제시해줘. (코드 첨부)"
프롬프트 3 — 확장 설계형
"영업일 판단 로직을 APScheduler와 결합해서, 매일 오전 9시에 실행하되 주말·공휴일이면 자동으로 건너뛰는 스케줄러 예제를 만들어줘. 다음 영업일이 언제인지 로그로 남기는 기능도 추가해줘."
이처럼 "무엇을 입력받아, 어떤 제약 아래, 무엇을 출력하고, 어떤 예외를 처리할지"를 한 문장에 응축하면 AI가 추측 없이 정확한 코드를 내놓습니다.