Автор оригинала: Guest Contributor.
Введение в модуль календаря Python
Вступление
Python имеет встроенный модуль с именем Calendar
, который содержит полезные классы и функции для поддержки различных календарных операций. По умолчанию модуль Calendar
следует григорианскому календарю, где понедельник-первый день недели (0), а воскресенье-последний день недели (6).
В Python модули datetime и time также предоставляют низкоуровневые функции, связанные с календарем. В дополнение к этим модулям модуль Calendar
предоставляет основные функции, связанные с отображением и манипулированием календарями.
Для печати календарей и управления ими модуль Calendar
имеет 3 важных класса: Calendar
, TextCalendar
и HTMLCalendar
. В этой статье мы увидим, как эти классы могут помочь реализовать различные функции, связанные с календарем.
Функциональные возможности модуля Календаря
Чтобы использовать модуль Calendar
, нам нужно сначала импортировать модуль с помощью:
import calendar
Давайте взглянем на список полезных функций в этом модуле.
Печать календаря на определенный месяц
Мы можем распечатать календарь на определенный месяц, используя следующую функцию:
calendar.month(yyyy, m, w, l)
Аргументами, передаваемыми этой функции, являются год ( yyyy
), месяц ( m
), ширина столбца даты ( w
) и количество строк в неделю ( l
) соответственно. Например, давайте воспользуемся этой функцией для печати календаря на март 2019 года:
print ("Calendar of March 2019 is:") print (calendar.month(2019, 3, 2, 1))
Выход:
Calendar of March 2019 is: March 2019 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.calendar(yyyy, w, l, c, m)
Приведенная выше функция возвращает календарь за весь год, за год, указанный в качестве аргумента. Аргументами, передаваемыми этой функции, являются год ( гггг
), ширина столбца даты ( w
), количество строк в неделю ( l
), количество пробелов между столбцами месяца ( c
), количество столбцов ( m
).
Например, чтобы распечатать календарь на 2019 год, используйте:
print(calendar.calendar(2019, 2, 2, 6, 3))
Выход:
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 1 2 3 1 2 3 7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10 14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17 21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24 28 29 30 31 25 26 27 28 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.prmonth()
и calendar.pryear()
для печати календарей месяца и года. Эти функции печатают выходные данные на вашем терминале.
Проверка на Високосный год
Мы можем использовать функцию sleep ()
, чтобы проверить, является ли год високосным или нет. Год передается в качестве аргумента функции, и функция возвращает True
, если год является високосным, в противном случае она возвращает False
, если год не является високосным. Давайте воспользуемся этой функцией, чтобы узнать, является ли 2016 год високосным:
calendar.isleap(2016)
Выход:
True
Количество високосных лет в пределах диапазона
Также можно проверить количество високосных лет в заданном диапазоне лет, указанном в качестве аргумента приведенной ниже функции:
calendar.leapdays(year1, year2)
Аргументы, переданные функции, являются 2 допустимыми значениями года. Эта функция возвращает число високосных лет между этими годами.
Пример:
calendar.leapdays(2000, 2017)
Выход:
5
Как видно, между 2000 и 2017 годами существует 5 високосных лет, следовательно, выход составляет 5.
Верните день недели
Метод weekday
принимает 3 аргумента, а именно: год, месяц и день. Функция возвращает день недели, причем понедельник имеет индекс 0, а воскресенье-индекс 6. Например:
calendar.weekday(2019, 3, 21)
Выход:
3
Как видно, эта функция возвращает значение индекса “3”, то есть “Четверг”.
Получение Сокращенных Названий Дней Недели
Функция weekheader
принимает аргумент n
, который задает количество символов для конкретного имени дня недели и возвращает заголовок, содержащий сокращенные имена дней недели.
Например:
print (calendar.weekheader(2))
Выход:
Mo Tu We Th Fr Sa Su
Аналогично,
print (calendar.weekheader(3))
Выход:
Mon Tue Wed Thu Fri Sat Sun
Получение количества дней в месяце
Функция month range
принимает 2 аргумента: year и month. Эта функция возвращает кортеж, содержащий индекс дня недели, в котором начинается месяц, и количество дней в месяце.
Например:
print (calendar.monthrange(1983, 12))
Выход:
{3,31}
Поскольку первый день декабря 1983 года был четвергом, функция возвращает значение индекса четверга как первого элемента кортежа, а 31-это число дней в декабре.
Получите недели в месяц
Функция month calendar
принимает 2 аргумента: year и month и возвращает матрицу, в которой каждая строка представляет неделю в этом месяце.
Например:
print(calendar.monthcalendar(1983, 11))
Выход:
[[0,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,19,30,0,0,0]]
Как вы можете видеть, каждый недельный массив начинается с понедельника, а дни вне месяца представлены нулями. Таким образом, первый массив указывает, что первый день месяца-вторник.
Изменение Настроек По Умолчанию
Настройки календаря по умолчанию можно изменить в соответствии с вашими потребностями. Например, следующий сценарий устанавливает понедельник как первый день недели.
class calendar.calendar(firstweekday=0)
По умолчанию календари следуют европейской конвенции, имея понедельник в качестве первого дня недели и воскресенье в качестве последнего дня недели. Кроме того, месяц Январь имеет значение индекса 1, а декабрь-значение индекса 12.
Полезные методы класса Calendar
Ниже приведены некоторые из наиболее полезных методов класса calendar.
Метод iterweekdays()
Этот метод возвращает итератор, содержащий список индексов для дней недели.
Например:
import calendar c = calendar.Calendar() for i in c.iterweekdays(): print (i, end=" ")
Выход:
0 1 2 3 4 5 6
Метод itermonthdates()
Функция itermonthdates()
принимает 2 аргумента: year и month. Эта функция возвращает итератор всех дней данного месяца. Кроме того, отображаются все дни до начала месяца и после его окончания, необходимые для получения полной недели.
Пример:
import calendar c = calendar.Calendar() for i in c.itermonthdates (2019, 1): print (i, end=" ")
Выход:
2018-12-31 2019-01-01 2019-01-02 2019-01-03 ..............2019-02-03
Метод itermonthdays()
Этот метод аналогичен методу itermonthdates
, но он возвращает только номера дней.
Пример:
import calendar c = calendar.Calendar() for i in c.itermonthdays (2019, 1): print (i, end=" ")
Выход:
0 1 2 3 4 5 6........ 31 0 0 0
Как видите, все дни до начала месяца и после его окончания, чтобы получить полную неделю, установлены на “0”.
Метод itermonthdays2()
Этот метод отображает кортеж, состоящий из чисел дня и дня недели.
Пример:
import calendar c = calendar.Calendar() for i in c.itermonthdays2 (2019, 1): print (i, end=" ")
Выход:
(0,0) (1,1) (2,2) (3,3) (4,4) (5,5) (6,6) (7,0) (8,1) (9,2) ...........
Метод itermonthdays3()
Этот метод очень похож на метод itermonthdays3 ()
, за исключением того, что он возвращает кортеж года, месяца и дня месяца.
Пример:
import calendar c = calendar.Calendar() for i in c.itermonthdays3 (2019, 1): print (i, end=" ")
Выход:
(2018,12,31) (2019,01,01) (2019,01,02).....(2019,01,31) (2019,02,01) (2019,02,02) (2019,02,03)
Метод monthdatescalendar()
Этот метод принимает год и месяц в качестве аргументов и возвращает список полных недель в месяце. Каждая неделя-это список из 7 дат и времени.объекты даты.
Пример:
import calendar c = calendar.Calendar() for i in c.monthdatescalendar (2019, 1): print (i, end=" ")
Выход:
[datetime.date(2018, 12, 31), datetime.date(2019, 01, 01), datetime.date(2019, 01, 02), datetime.date(2019, 01, 03), datetime.date(2019, 01, 04), datetime.date(2019, 01, 05), datetime.date(2019, 01, 06)... datetime.date(2019, 02, 03)] .....
Метод календарных дней месяца 2()
Эта функция принимает год и месяц в качестве аргументов и возвращает список недель, причем каждая неделя представляет собой 7 кортежей дня месяца и дня недели.
Пример:
import calendar c = calendar.Calendar() for i in c.monthdays2calendar (2019, 1): print(i, end=" ")
Выход:
[(0,0) (1,1) (2,2) (3,3) (4,4) (5,5) (6,6)] [(7,0) (8,1) (9,2) (10,3) (11,4) (12,5) (13,6)] ....
Как вы видите, первое значение кортежа-это день месяца (0-31), а второе значение кортежа-номер недели (0-6)
Метод monthdayscalendar()
Этот метод принимает год и месяц в качестве аргументов и возвращает список полных недель, причем каждая неделя является списком дней месяца.
Пример:
import calendar c = calendar.Calendar() for i in c.monthdayscalendar(2019, 1): print (i, end=" ")
Пример Вывода:
[0, 1, 2 , 3, 4, 5, 6] [7, 8, 9, 10, 11, 12, 13]....[28, 29, 30, 31, 0, 0, 0]
Метод yeardatescalendar()
Эта функция принимает год ( гггг
) и количество месяцев в строке месяца ( ж
). По умолчанию параметр w
равен 3. Функция возвращает список строк месяца, где дни-это datetime.дата
объекты.
Пример:
import calendar c = calendar.Calendar() for i in c.yeardatescalendar(2019, 3): print (i, end=" ")
Выход:
[[[datetime.date(2018, 12, 31), datetime.date(2019, 1, 1), datetime.date(2019, 1, 2), datetime.date(2019, 1, 3), datetime.date(2019, 1, 4), datetime.date(2019, 1, 5), datetime.date(2019, 1, 6)], [datetime.date(2019, 1, 7), datetime.date(2019, 1, 8), datetime.date(2019, 1, 9), datetime.date(2019, 1, 10), datetime.date(2019, 1, 11), datetime.date(2019, 1, 12), datetime.date(2019, 1, 13)], [datetime.date(2019, 1, 14), datetime.date(2019, 1, 15), datetime.date(2019, 1, 16), datetime.date(2019, 1, 17), datetime.date(2019, 1, 18), datetime.date(2019, 1, 19), datetime.date(2019, 1, 20)], [datetime.date(2019, 1, 21), datetime.date(2019, 1, 22), datetime.date(2019, 1, 23), datetime.date(2019, 1, 24), datetime.date(2019, 1, 25), datetime.date(2019, 1, 26), datetime.date(2019, 1, 27)], [datetime.date(2019, 1, 28), datetime.date(2019, 1, 29), datetime.date(2019, 1, 30), datetime.date(2019, 1, 31), datetime.date(2019, 2, 1), datetime.date(2019, 2, 2), datetime.date(2019, 2, 3)]] ... ]
Метод yeardays2calendar()
Эта функция принимает год ( гггг
) и количество месяцев, которые мы хотим в строке месяца ( w
). По умолчанию параметр w
равен 3. Функция возвращает список недель в виде кортежей дней месяца и дня недели.
Пример:
import calendar c = calendar.Calendar() for i in c.yeardays2calendar(2019, 3): print (i, end=" ")
Выход:
[[[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)], [(7, 0), (8, 1), (9, 2), (10, 3), (11, 4), (12, 5), (13, 6)], [(14, 0), (15, 1), (16, 2), (17, 3), (18, 4), (19, 5), (20, 6)], [(21, 0), (22, 1), (23, 2), (24, 3), (25, 4), (26, 5), (27, 6)], [(28, 0), (29, 1), (30, 2), (31, 3), (0, 4), (0, 5), (0, 6)]], [[(0, 0), (0, 1), (0, 2), (0, 3), (1, 4), (2, 5), (3, 6)], [(4, 0), (5, 1), (6, 2), (7, 3), (8, 4), (9, 5), (10, 6)], [(11, 0), (12, 1), (13, 2), (14, 3), (15, 4), (16, 5), (17, 6)], [(18, 0), (19, 1), (20, 2), (21, 3), (22, 4), (23, 5), (24, 6)], [(25, 0), (26, 1), (27, 2), (28, 3), (0, 4), (0, 5), (0, 6)]], [[(0, 0), (0, 1), (0, 2), (0, 3), (1, 4), (2, 5), (3, 6)] ... ]]
Метод календаря дней года()
Эта функция принимает год ( гггг
) и количество месяцев, которые мы хотим в строке месяца ( w
). По умолчанию параметр w
равен 3. Функция возвращает список недель в качестве дня месяца.
Пример:
import calendar c = calendar.Calendar() for i in c.yeardayscalendar(2019, 3): print (i, end=" ")
Выход:
[[[0, 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, 0, 0, 0, 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, 0, 0, 0]], [[0, 0, 0, 0, 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]]] [[[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, 0, 0, 0, 0, 0]] ... ]]
Класс Текстового календаря
Text Calendar
используется для создания простых текстовых календарей. Аналогично классу Calendar
. Этот класс принимает конструктор, в котором первый день недели по умолчанию равен 0. Давайте рассмотрим методы, предоставляемые классом Text Calendar
.
Метод format month()
Этот метод принимает 4 аргумента, а именно: год, месяц, ширину столбца дней ( w
) и количество строк, используемых каждой неделей ( l
). Этот метод возвращает многострочную строку.
Пример:
import calendar c = calendar.TextCalendar() print(c.formatmonth(2019, 1))
Здесь отображается календарь на январь 2019 года.
Выход:
January 2019 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
Метод pr month():
Этот метод печатает календарь месяца, возвращаемый методом format month
. Мы можем использовать эту функцию, чтобы избежать использования функции “печать”, чтобы распечатать календарь на терминале.
Чтобы распечатать календарь на январь 2019 года, используйте:
c.prmonth(2019, 1)
Метод format year():
Этот метод возвращает календарь столбца “m” на весь год. Аргументами, передаваемыми этой функции, являются год ( гггг
), ширина столбца даты ( w
), количество строк в неделю ( l
), количество пробелов между столбцами месяца ( c
), количество столбцов ( m
).
Класс LocaleTextCalendar:
Это подкласс класса Text Calendar
. Его конструктор принимает дополнительный аргумент locale
. Он будет возвращать имена месяцев и дней недели в указанной локали. Мы можем создать текстовый объект календаря на нашем родном языке. Мы можем получить месяц, дни недели или другие данные для отображения календаря, отформатированного из локальной системы, кроме текущего по умолчанию. Пример:
import calendar for name in calendar.month_name: print(name)
Это выведет название месяцев в соответствии с локальной системой.
Выход:
January February March April May June July August September October November December
Класс HTML Calendar:
Это похоже на Text Calendar
class, but, генерирует HTML-календарь. Конструктор для этого класса имеет значение first weekday
равное “0”.
Ниже приведены некоторые из методов, предоставляемых классом HTML Calendar
.
Метод format month():
Эта функция отображает календарь месяца в формате HTML-таблицы. Мы можем отобразить календарь на апрель 2019 года в виде HTML-таблицы, используя:
hc = calendar.HTMLCalendar() print(hc.formatmonth(2019, 4))
Выход:
April 2019 | ||||||
---|---|---|---|---|---|---|
Mon | Tue | Wed | Thu | Fri | Sat | Sun |
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 |
Метод format year():
Этот метод принимает год и количество месяцев подряд ( w
) в качестве аргументов и печатает весь календарь года в виде HTML-таблицы. По умолчанию ширина установлена на 3. Мы можем отобразить календарь на 2019 год в виде HTML-таблицы, используя:
hc = calendar.HTMLCalendar() print(hc.formatyear(2019, 4))
Метод formatyearpage():
Этот метод принимает в качестве аргументов год, количество месяцев подряд ( w
), каскадную таблицу стилей (CSS) и кодировку. Аргументы css
и encoding
могут быть установлены в None
, если мы не используем CSS и encoding. Эта функция отображает календарь всего года в виде HTML-страницы шириной по умолчанию 3. Мы можем распечатать календарь на 2019 год в виде HTML-страницы, используя:
hc = calendar.HTMLCalendar() print(hc.formatyearpage(2019, 3, css=None, encoding=None))
b'\n \n\n\n\nCalendar for 2019 \n\n\n
2019 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Вывод HTMLCalendar
выглядит аналогично текстовой версии, но он обернут HTML-тегами. Ячейка HTML-таблицы содержит атрибут класса, соответствующий дню недели. Поэтому HTML-календарь можно стилизовать с помощью CSS.
Класс LocaleHTMLCalendar
Это подкласс класса HTML Calendar
. Его конструктор принимает дополнительный аргумент locale
. Он будет возвращать имена месяцев и дней недели в указанной локали в виде HTML-таблицы. Мы можем создать текстовый объект календаря на нашем родном языке. Например, мы можем сгенерировать календарь на апрель 2019 года в виде HTML-таблицы в локале ‘en_AU’, используя:
import calendar cal = calendar.LocaleHTMLCalendar(locale='en_AU.utf8') print(cal.formatmonth(2019, 4))
Выход:
April 2019 | ||||||
---|---|---|---|---|---|---|
Mon | Tue | Wed | Thu | Fri | Sat | Sun |
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 |
Вывод
В этом уроке мы обсудили использование различных классов и подклассов модуля Calendar
в Python для работы с датами для управления значениями, ориентированными на неделю/месяц/год. Мы также обсудили использование функций в модуле календаря Python. Наряду с этим мы также реализовали классы Text Calendar
и HTML Calendar
для получения предварительно отформатированного вывода. Я надеюсь, что учебник был информативным!