Модуль calendar в Python: экспертное руководство с примерами кода
Встроенный модуль calendar в Python предлагает мощные инструменты для работы с датами, месяцами и годами. Используя классы вроде TextCalendar и HTMLCalendar, разработчики могут создавать печатаемые или веб-ориентированные календари, итерироваться по дням и даже вычислять пользовательские правила планирования.
Ниже — пошаговый обзор самых частых сценариев, с готовыми к запуску сниппетами для Python 2 и Python 3.
Шаг 1 — Генерация текстового календаря
Запустите следующий скрипт, чтобы увидеть обычный текстовый календарь для января 2025 года, с началом недели в четверг:

- Строка 1:
import calendarзагружает модуль. - Строка 3:
c = calendar.TextCalendar(calendar.THURSDAY)создаёт объект календаря, недели которого начинаются в четверг. - Строка 4:
txt = c.formatmonth(2025, 1)форматирует январь 2025 года. - Строка 5:
print(txt)выводит календарь.
Смените начальный день на воскресенье, чтобы проверить гибкость:

Шаг 2 — Рендеринг HTML-календаря
Для веб-приложений HTMLCalendar может сгенерировать полную HTML-таблицу, которую можно стилизовать через CSS:

Шаг 3 — Итерация по дням месяца
Метод itermonthdays выдаёт все дни месяца, включая нули-заполнители для дней, принадлежащих соседним месяцам. Это полезно для выравнивания календарей:

- Нули обозначают ячейки, выпадающие за целевой месяц.
- Они помогают определить, на какой неделе начинается и заканчивается месяц.
Шаг 4 — Получение локализованных имён
Python автоматически учитывает системную локаль для имён месяцев и дней недели. Ниже — пример вывода при печати calendar.month_name и calendar.day_name:

Настройки локали تختلف по машинам, поэтому результаты могут отличаться для пользователей в других странах.
Шаг 5 — Вычисление пользовательских дат (например, первый понедельник каждого месяца)
Ниже — лаконичный скрипт, находящий первый понедельник каждого месяца в 2025 году:

Логика использует calendar.monthcalendar для получения матрицы недель, затем проверяет первые две недели на ненулевое значение понедельника.
Пример для Python 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)
Пример для Python 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для точных раскладок календаря, обрабатывая нули-заполнители. - Данные локали автоматически доступны через
calendar.month_nameиcalendar.day_name. - Вычисляйте правило-ориентированные даты (например, первый понедельник) с
calendar.monthcalendarи простой логикой.
Python
- Абстрактные классы в C#: практическое руководство с примерами кода
- Мастерство метода strip() в Python: подробное руководство и практические примеры
- Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами
- Функция round() в Python: подробное объяснение с практическими примерами
- Освоение функции map() в Python: синтаксис, примеры и лучшие практики
- Python timeit(): измерение времени выполнения с практическими примерами
- Освоение yield в Python: генератор против return — практическое руководство
- Counter в collections Python: эффективное подсчёт, обновление и арифметические операции
- Python list.count(): экспертное руководство с практическими примерами
- Python list.index(): как находить позиции элементов — практические примеры