파이썬 calendar 모듈 전문가 가이드: 코드 예제로 배우는 달력 생성과 날짜 계산
파이썬 내장 calendar 모듈은 날짜, 월, 년을 다루는 강력한 도구를 제공합니다. TextCalendar와 HTMLCalendar 같은 클래스를 활용해 인쇄용 또는 웹 친화적인 달력을 만들고, 날짜를 순회하며, 맞춤형 스케줄링 규칙을 계산할 수 있습니다.
아래는 가장 일반적인 사용 사례를 단계별로 안내하며, 파이썬 2와 3 모두에서 바로 실행 가능한 코드 스니펫을 포함합니다.
1단계 – 텍스트 달력 생성
다음 스크립트를 실행해 2025년 1월의 일반 텍스트 달력을 확인하세요. 주의 시작일을 목요일로 설정했습니다:

- 1행:
import calendar로 모듈 로드
- 3행:
c = calendar.TextCalendar(calendar.THURSDAY)로 주의 시작이 목요일인 달력 객체 생성
- 4행:
txt = c.formatmonth(2025, 1)로 2025년 1월 포맷팅
- 5행:
print(txt)로 달력 출력
시작일을 일요일로 변경해 유연성 확인:

2단계 – HTML 달력 렌더링
웹 애플리케이션용으로 HTMLCalendar가 CSS로 스타일링 가능한 전체 HTML 테이블을 생성합니다:

3단계 – 월의 날짜 순회
itermonthdays 메서드는 해당 월의 모든 날짜를 산출하며, 인접 월에 속하는 날짜는 0으로 패딩합니다. 이는 달력 정렬에 유용합니다:

- 0은 대상 월 밖의 슬롯을 나타냄
- 월이 어느 요일에 시작하고 끝나는지 판단하는 데 도움
4단계 – 로케일 인식 이름 가져오기
파이썬은 시스템 로케일에 따라 월명과 요일명을 자동으로 제공합니다. calendar.month_name과 calendar.day_name 출력 예시:

로케일 설정은 머신마다 다르므로 다른 국가 사용자는 결과가 다를 수 있습니다.
5단계 – 맞춤 날짜 계산(예: 매월 첫 번째 월요일)
2025년 매월 첫 번째 월요일을 찾는 간결한 스크립트:

로직은 calendar.monthcalendar로 주 매트릭스를 얻은 뒤, 첫 두 주에서 0이 아닌 월요일 값을 확인합니다.
파이썬 2 예제
import calendar
# 일반 텍스트 달력 생성
c = calendar.TextCalendar(calendar.THURSDAY)
text = c.formatmonth(2025, 1)
print text
# HTML 포맷 달력 생성
hc = calendar.HTMLCalendar(calendar.THURSDAY)
html = hc.formatmonth(2025, 1)
print html
# 월의 날짜 순회
for i in c.itermonthdays(2025, 4):
print i
# 로케일 인식 월/요일명
for name in calendar.month_name:
print name
for day in calendar.day_name:
print day
# 매월 첫 번째 월요일 찾기
for month in range(1, 13):
mycal = calendar.monthcalendar(2025, month)
week1 = mycal[0]
week2 = mycal[1]
if week1[calendar.MONDAY] != 0:
auditday = week1[calendar.MONDAY]
else:
auditday = week2[calendar.MONDAY]
print "%10s %2d" % (calendar.month_name[month], auditday)
파이썬 3 예제
import calendar
# 일반 텍스트 달력 생성
c = calendar.TextCalendar(calendar.THURSDAY)
text = c.formatmonth(2025, 1)
print(text)
# HTML 포맷 달력 생성
hc = calendar.HTMLCalendar(calendar.THURSDAY)
html = hc.formatmonth(2025, 1)
print(html)
# 월의 날짜 순회
for i in c.itermonthdays(2025, 4):
print(i)
# 로케일 인식 월/요일명
for name in calendar.month_name:
print(name)
for day in calendar.day_name:
print(day)
# 매월 첫 번째 월요일 찾기
for month in range(1, 13):
mycal = calendar.monthcalendar(2025, month)
week1 = mycal[0]
week2 = mycal[1]
if week1[calendar.MONDAY] != 0:
auditday = week1[calendar.MONDAY]
else:
auditday = week2[calendar.MONDAY]
print("%10s %2d" % (calendar.month_name[month], auditday))
핵심 요약
TextCalendar와 HTMLCalendar로 주의 시작일과 포맷 커스터마이징
itermonthdays로 정밀한 달력 레이아웃 구성, 패딩 0 처리
calendar.month_name과 calendar.day_name으로 로케일 데이터 자동 활용
calendar.monthcalendar과 간단한 로직으로 규칙 기반 날짜(예: 첫 월요일) 계산