Python calendar Module - A Complete Tutorial

In this guide, you'll explore Python's calendar module, which is used for managing dates and calendars. Learn its functions and examples for practical applications.

The calendar module in Python provides functions and classes for working with dates and generating calendar-related data. It includes tools for formatting calendar dates as text, calculating the dates of holidays, and finding the weekday of a specific date.

Table of Contents

  1. Introduction
  2. Calendar Functions
    • calendar.calendar
    • calendar.month
    • calendar.isleap
    • calendar.leapdays
    • calendar.weekday
    • calendar.weekheader
    • calendar.monthrange
    • calendar.monthcalendar
    • calendar.timegm
    • calendar.HTMLCalendar
    • calendar.LocaleTextCalendar
  3. Examples
    • Printing a Text Calendar
    • Checking for Leap Year
    • Finding Weekday of a Date
    • Getting Month Range
    • Generating a HTML Calendar
  4. Real-World Use Case
  5. Conclusion
  6. References

Introduction

The calendar module allows you to generate and work with calendar data in Python. It provides functions to output calendars as text or HTML, calculate leap years, determine the day of the week for a given date, and more.

Calendar Functions

calendar.calendar

Returns a multi-line string with a calendar for an entire year.

import calendar

year_calendar = calendar.calendar(2024)
print(year_calendar)

Output:

                                  2024

      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  3  4  5  6  7                1  2  3  4                   1  2  3
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       4  5  6  7  8  9 10
15 16 17 18 19 20 21      12 13 14 15 16 17 18      11 12 13 14 15 16 17
22 23 24 25 26 27 28      19 20 21 22 23 24 25      18 19 20 21 22 23 24
29 30 31                  26 27 28 29               25 26 27 28 29 30 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  4  5  6  7             1  2  3  4  5                      1  2
 8  9 10 11 12 13 14       6  7  8  9 10 11 12       3  4  5  6  7  8  9
15 16 17 18 19 20 21      13 14 15 16 17 18 19      10 11 12 13 14 15 16
22 23 24 25 26 27 28      20 21 22 23 24 25 26      17 18 19 20 21 22 23
29 30                     27 28 29 30 31            24 25 26 27 28 29 30

        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  4  5  6  7                1  2  3  4                         1
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       2  3  4  5  6  7  8
15 16 17 18 19 20 21      12 13 14 15 16 17 18       9 10 11 12 13 14 15
22 23 24 25 26 27 28      19 20 21 22 23 24 25      16 17 18 19 20 21 22
29 30 31                  26 27 28 29 30 31         23 24 25 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  3  4  5  6                   1  2  3                         1
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       2  3  4  5  6  7  8
14 15 16 17 18 19 20      11 12 13 14 15 16 17       9 10 11 12 13 14 15
21 22 23 24 25 26 27      18 19 20 21 22 23 24      16 17 18 19 20 21 22
28 29 30 31               25 26 27 28 29 30         23 24 25 26 27 28 29
                                                    30 31

calendar.month

Returns a multi-line string with a calendar for a month.

import calendar

month_calendar = calendar.month(2024, 7)
print(month_calendar)

Output:

     July 2024
Mo Tu We Th Fr Sa Su
 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

calendar.isleap

Returns True if the year is a leap year, otherwise False.

import calendar

print(calendar.isleap(2024))

Output:

True

calendar.leapdays

Returns the number of leap years in the range from y1 to y2, exclusive.

import calendar

print(calendar.leapdays(2000, 2025))

Output:

7

calendar.weekday

Returns the day of the week (0 is Monday, 6 is Sunday) for a given date.

import calendar

print(calendar.weekday(2024, 7, 25))

Output:

3

calendar.weekheader

Returns a header string for the weekdays with the specified width.

import calendar

print(calendar.weekheader(2))

Output:

Mo Tu We Th Fr Sa Su

calendar.monthrange

Returns a tuple with the weekday of the first day of the month and the number of days in the month.

import calendar

print(calendar.monthrange(2024, 7))

Output:

(calendar.MONDAY, 31)

calendar.monthcalendar

Returns a matrix representing a month’s calendar. Each row represents a week.

import calendar

print(calendar.monthcalendar(2024, 7))

Output:

[[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, 0, 0, 0, 0]]

calendar.timegm

Converts a time tuple in UTC to seconds since the Epoch.

import calendar
import time

time_tuple = time.gmtime()
seconds_since_epoch = calendar.timegm(time_tuple)
print(seconds_since_epoch)

Output:

1722059135

calendar.HTMLCalendar

This class can be used to generate HTML calendars.

import calendar

html_cal = calendar.HTMLCalendar(calendar.SUNDAY)
html_calendar = html_cal.formatmonth(2024, 7)
print(html_calendar)

Output:

<table border="0" cellpadding="0" cellspacing="0" class="month">
<tr><th colspan="7" class="month">July 2024</th></tr>
<tr><th class="sun">Sun</th><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th></tr>
<tr><td class="noday">&nbsp;</td><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td></tr>
<tr><td class="sun">7</td><td class="mon">8</td><td class="tue">9</td><td class="wed">10</td><td class="thu">11</td><td class="fri">12</td><td class="sat">13</td></tr>
<tr><td class="sun">14</td><td class="mon">15</td><td class="tue">16</td><td class="wed">17</td><td class="thu">18</td><td class="fri">19</td><td class="sat">20</td></tr>
<tr><td class="sun">21</td><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td></tr>
<tr><td class="sun">28</td><td class="mon">29</td><td class="tue">30</td><td class="wed">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
</table>

calendar.LocaleTextCalendar

This class allows you to generate text calendars using a specific locale.

import calendar
import locale

locale.setlocale(locale.LC_TIME, 'en_US.UTF-8')

locale_cal = calendar.LocaleTextCalendar(calendar.SUNDAY, 'en_US.UTF-8')
locale_calendar = locale_cal.formatmonth(2024, 7)
print(locale_calendar)

Output:

     July 2024
Su Mo Tu We Th Fr Sa
    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

Examples

Printing a Text Calendar

Print a text calendar for the year 2024.

import calendar

year_calendar = calendar.calendar(2024)
print(year_calendar)

Output:

                                  2024

      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  3  4  5  6  7                1  2  3  4                   1  2  3
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       4  5  6  7  8  9 10
15 16 17 18 19 20 21      12 13 14 15 16 17 18      11 12 13 14 15 16 17
22 23 24 25 26 27 28      19 20 21 22 23 24 25      18 19 20 21 22 23 24
29 30 31                  26 27 28 29               25 26 27 28 29 30 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  4  5  6  7             1  2  3  4  5                      1  2
 8  9 10 11 12 13 14       6  7  8  9 10 11 12       3  4  5  6  7  8  9
15 16 17 18 19 20 21      13 14 15 16 17 18 19      10 11 12 13 14 15 16
22 23 24 25 26 27 28      20 21 22 23 24 25 26      17 18 19 20 21 22 23
29 30                     27 28 29 30 31            24 25 26 27 28 29 30

        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  4  5  6  7                1  2  3  4                         1
 8  9 10 11 12 13 14       5  6  7  8  9 10 11       2  3  4  5  6  7  8
15 16 17 18 19 20 21      12 13 14 15 16 17 18       9 10 11 12 13 14 15
22 23 24 25 26 27 28      19 20 21 22 23 24 25      16 17 18 19 20 21 22
29 30 31                  26 27 28 29 30 31         23 24 25 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  3  4  5  6                   1  2  3                         1
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       2  3  4  5  6  7  8
14 15 16 17 18 19 20      11 12 13 14 15 16 17       9 10 11 12 13 14 15
21 22 23 24 25 26 27      18 19 20 21 22 23 24      16 17 18 19 20 21 22
28 29 30 31               25 26 27 28 29 30         23 24 25 26 27 28 29
                                                    30 31

Checking for Leap Year

Check if 2024 is a leap year.

import calendar

is_leap = calendar.isleap(2024)
print(f"Is 2024 a leap year? {is_leap}")

Output:

Is 2024 a leap year? True

Finding the Weekday of a Date

Find the weekday of July 25, 2024.

import calendar

weekday = calendar.weekday(2024, 7, 25)
print(f"The weekday of July 25, 2024 is {calendar.day_name[weekday]}")

Output:

The weekday of July 25, 2024 is Thursday

Getting Month Range

Get the weekday of the first day and the number of days in July 2024.

import calendar

first_day, num_days = calendar.monthrange(2024, 7)
print(f"First day: {calendar.day_name[first_day]}, Number of days: {num_days}")

Output:

First day: Monday, Number of days: 31

Generating an HTML Calendar

Generate an HTML calendar for July 2024.

import calendar

html_cal = calendar.HTMLCalendar(calendar.SUNDAY)
html_calendar = html_cal.formatmonth(2024, 7)
print(html_calendar)

Output:

<table border="0" cellpadding="0" cellspacing="0" class="month">
<tr><th colspan="7" class="month">July 2024</th></tr>
<tr><th class="sun">Sun</th><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th></tr>
<tr><td class="noday">&nbsp;</td><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td></tr>
<tr><td class="sun">7</td><td class="mon">8</td><td class="tue">9</td><td class="wed">10</td><td class="thu">11</td><td class="fri">12</td><td class="sat">13</td></tr>
<tr><td class="sun">14</td><td class="mon">15</td><td class="tue">16</td><td class="wed">17</td><td class="thu">18</td><td class="fri">19</td><td class="sat">20</td></tr>
<tr><td class="sun">21</td><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu">25</td><td class="fri">26</td><td class="sat">27</td></tr>
<tr><td class="sun">28</td><td class="mon">29</td><td class="tue">30</td><td class="wed">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
</table>

Real-World Use Case

Scheduling Events

Suppose you are developing a web application that allows users to schedule events. You can use the calendar module to generate a monthly calendar and highlight the days with scheduled events.

import calendar
from datetime import datetime

def highlight_events(year, month, events):
    cal = calendar.HTMLCalendar(calendar.SUNDAY)
    month_calendar = cal.formatmonth(year, month)
    for event_date in events:
        event_str = f'<b>{event_date.day}</b>'
        month_calendar = month_calendar.replace(f'>{event_date.day}<', f'>{event_str}<')
    return month_calendar

events = [datetime(2024, 7, 10), datetime(2024, 7, 20), datetime(2024, 7, 25)]
html_calendar = highlight_events(2024, 7, events)
print(html_calendar)

Output:

<table border="0" cellpadding="0" cellspacing="0" class="month">
<tr><th colspan="7" class="month">July 2024</th></tr>
<tr><th class="sun">Sun</th><th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th><th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th></tr>
<tr><td class="noday">&nbsp;</td><td class="mon">1</td><td class="tue">2</td><td class="wed">3</td><td class="thu">4</td><td class="fri">5</td><td class="sat">6</td></tr>
<tr><td class="sun">7</td><td class="mon">8</td><td class="tue">9</td><td class="wed"><b>10</b></td><td class="thu">11</td><td class="fri">12</td><td class="sat">13</td></tr>
<tr><td class="sun">14</td><td class="mon">15</td><td class="tue">16</td><td class="wed">17</td><td class="thu">18</td><td class="fri">19</td><td class="sat"><b>20</b></td></tr>
<tr><td class="sun">21</td><td class="mon">22</td><td class="tue">23</td><td class="wed">24</td><td class="thu"><b>25</b></td><td class="fri">26</td><td class="sat">27</td></tr>
<tr><td class="sun">28</td><td class="mon">29</td><td class="tue">30</td><td class="wed">31</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td></tr>
</table>

Conclusion

The calendar module in Python provides a comprehensive set of tools for working with dates and generating calendars. Whether you need to check for leap years, find the weekday of a specific date, generate text or HTML calendars, or manage locale-specific calendars, the calendar module has you covered. By leveraging these capabilities, you can effectively manage and display calendar data in your applications.

References

Comments

Spring Boot 3 Paid Course Published for Free
on my Java Guides YouTube Channel

Subscribe to my YouTube Channel (165K+ subscribers):
Java Guides Channel

Top 10 My Udemy Courses with Huge Discount:
Udemy Courses - Ramesh Fadatare