본문 바로가기
프로그래밍/Python

파이썬(Python) 달력 다루기 (feat. calendar)

by 부자 꽁냥이 2023. 3. 18.

파이썬(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)])

 


댓글


맨 위로