파이썬(Python)에서는 달력을 다루기 위한 calendar 모듈이 있다. 이번 포스팅에서는 calendar 모듈과 관련하여 실제로 많이 쓰일 법한 것들을 알아보고자 한다.
calendar 모듈
1) 달력 출력 : calendar, Calendar, TextCalendar
a. 특정 연도의 달력 출력
특정 연도의 달력을 출력하려면 calendar 함수에 보고 싶은 연도를 넣어주면 된다.
import calendar
print(calendar.calendar(2022))
위 코드를 실행하면 월요일을 주의 시작일로 한 달력이 출력되는 것을 알 수 있다.
2022
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3 4 5 6
3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13
10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20
17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27
24 25 26 27 28 29 30 28 28 29 30 31
31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 1 2 3 4 5
4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12
11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19
18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26
25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30
30 31
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 2 3 4 5 6 7 1 2 3 4
4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
25 26 27 28 29 30 31 29 30 31 26 27 28 29 30
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3 4
3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11
10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18
17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25
24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31
31
b. 특정 연월 달력에 포함된 날짜를 datetime 객체로 반환하기 : Calendar, monthdatescalendar
Calendar 객체의 monthdatescalendar를 이용하면 달력 상에서 주어진 연월에 포함된 날짜 정보를 datetime 객체로 반환한다. 이때 반환 값은 길이가 7인 리스트의 리스트이다. 말이 어렵다 아래 코드를 살펴보면 된다.
아래 코드는 월요일을 주의 시작일로 설정된 달력에서 2022년 3월에 포함된 날짜를 datetime 객체로 반환한다.
## 2022년 3월에 포함된 날짜를 datetime 객체로 가져오기
cal = calendar.Calendar(firstweekday=0) ## 월요일을 주의 시작으로 설정
year = 2022
month = 3
cal.monthdatescalendar(year, month)
[[datetime.date(2022, 2, 28),
datetime.date(2022, 3, 1),
datetime.date(2022, 3, 2),
datetime.date(2022, 3, 3),
datetime.date(2022, 3, 4),
datetime.date(2022, 3, 5),
datetime.date(2022, 3, 6)],
[datetime.date(2022, 3, 7),
datetime.date(2022, 3, 8),
datetime.date(2022, 3, 9),
datetime.date(2022, 3, 10),
datetime.date(2022, 3, 11),
datetime.date(2022, 3, 12),
datetime.date(2022, 3, 13)],
[datetime.date(2022, 3, 14),
datetime.date(2022, 3, 15),
datetime.date(2022, 3, 16),
datetime.date(2022, 3, 17),
datetime.date(2022, 3, 18),
datetime.date(2022, 3, 19),
datetime.date(2022, 3, 20)],
[datetime.date(2022, 3, 21),
datetime.date(2022, 3, 22),
datetime.date(2022, 3, 23),
datetime.date(2022, 3, 24),
datetime.date(2022, 3, 25),
datetime.date(2022, 3, 26),
datetime.date(2022, 3, 27)],
[datetime.date(2022, 3, 28),
datetime.date(2022, 3, 29),
datetime.date(2022, 3, 30),
datetime.date(2022, 3, 31),
datetime.date(2022, 4, 1),
datetime.date(2022, 4, 2),
datetime.date(2022, 4, 3)]]
c. 특정 연도의 월 단위 달력 출력하기 : TextCalendar, prmonth
TextCalendar 객체에 prmonth를 이용하면 특정 연도의 특정 월에 대한 달력을 출력할 수 있다. prmonth에서 w, l 인자를 이용하여 각각 좌우 간격, 위아래 간격을 조절할 수 있다.
아래 코드는 주의 시작일을 일요일로 설정된 경우 2022년 3월 달력을 출력한다.
text_cal = calendar.TextCalendar(firstweekday=6) ## 주의 시작일을 일요일로 설정
year = 2022
month = 3
text_cal.prmonth(year, month, w=5, l=2) ## w 좌우 간격, l 위 아래 간격
March 2022
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
pryear를 사용하면 처음에 봤던 특정 연도의 달력을 출력할 수도 있다. 아래 코드는 주의 시작일을 월요일로 설정한 경우의 2022년 달력을 출력한 것이다. 이는 calendar.calendar(2022)과 동일한 역할을 한다.
text_cal = calendar.TextCalendar(firstweekday=0) ## 주의 시작일을 월요일로 설정
year = 2022
text_cal.pryear(year, w=0, l=0) ## w 좌우 간격, l 위 아래 간격
2022
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3 4 5 6
3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13
10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20
17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27
24 25 26 27 28 29 30 28 28 29 30 31
31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 1 2 3 4 5
4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12
11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19
18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26
25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30
30 31
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 2 3 4 5 6 7 1 2 3 4
4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
25 26 27 28 29 30 31 29 30 31 26 27 28 29 30
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 1 2 3 4 5 6 1 2 3 4
3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11
10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18
17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25
24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31
2) 윤년 관련 : isleap, leapdays
a. 윤년 확인 : isleap
calendar 모듈의 isleap 함수를 이용하면 주어진 연도가 윤년인지 아닌지 확인할 수 있다.
print('2000년은 윤년인가?', calendar.isleap(2000))
print('2022년은 윤년인가?', calendar.isleap(2022))
b. 윤년 횟수 : leapdays
leapdays를 이용하면 특정 연도 기간에 윤년 횟수를 계산할 수 있다. 아래 코드는 2020년부터 2024년까지의 윤년 횟수를 계산한 것이다. 이때 두 번째 인자에는 2024에 1을 더해준 2025를 넣어줘야 한다. 오른쪽 끝에 있는 연도는 포함이 안되기 때문이다.
print('2020년부터 2024년까지 윤년 횟수', calendar.leapdays(2020, 2025))
3) 요일 확인 : weekday
calendar 모듈에서 weekday 함수를 이용하면 주어진 날짜의 요일을 알 수 있다. 리턴값은 0~6 까지이며 월요일~일요일(datetime과는 다르다)을 의미한다.
weekday_dict = {0:'월', 1:'화', 2:'수', 3:'목', 4:'금', 5:'토', 6:'일'}
print('2022년 11월 3일은 무슨 요일인가?', weekday_dict[calendar.weekday(2022, 11, 3)])
'프로그래밍 > Python' 카테고리의 다른 글
[병렬 프로그래밍] 5. multiprocessing 모듈을 이용하여 여러 인자를 갖는 함수 병렬 처리하기 (feat. starmap) (0) | 2023.03.22 |
---|---|
파이썬(Python) logging 모듈을 이용한 로그(Log) 남기기 (2) | 2023.03.21 |
파이썬(python) 날짜 다루기 (feat. datetime) (0) | 2023.03.18 |
파이썬(Python) textwrap 모듈을 이용한 긴 문장(문자열) 정리하기(생략, 줄바꿈). (0) | 2023.03.12 |
파이썬(Python) typing 모듈을 이용한 annotation 세부 설정하기 (0) | 2023.02.21 |
댓글