
In Python können Sie Kalender mit dem Kalendermodul in der Standardbibliothek als einfachen Text, HTML oder als Liste abrufen und ausgeben.
Dieser Artikel beschreibt die folgenden Inhalte.
- Kalender als Klartext abrufen/ausgeben
- Monatskalender
- Jahreskalender
- Stellen Sie den ersten Tag der Woche ein
- Ändern Sie Gebietsschema und Namen von Wochentagen
- Kalender als HTML-Tabelle abrufen/ausgeben
- Monatskalender
- Jahreskalender
- CSS-Klassen festlegen
- Stellen Sie den ersten Tag der Woche ein
- Ändern Sie Gebietsschema und Namen von Wochentagen
- Holen Sie sich Kalender als Liste
- Liste der Nummern
- Liste der Tupel
- Liste von datetime.date
- Auf der Kommandozeile
Auch für Schaltjahre bietet das Kalendermodul nützliche Funktionen.
Kalender als Klartext abrufen/ausgeben
Monatskalender
Sie können den Kalender jedes Jahres und Monats als String (str) mit Calendar.Monat() erhalten.
import calendar
print(calendar.month(2019, 1))
# 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
#
print(type(calendar.month(2019, 1)))
# <class 'str'>
Die Spaltenbreite kann mit dem w-Parameter und die Zeilenbreite mit dem l-Parameter angegeben werden.
print(calendar.month(2019, 1, w=3, l=2))
# January 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 31
#
#
Derselbe String kann mit Calendar.prmonth() ausgegeben werden.
calendar.prmonth(2019, 1)
# 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
Jahreskalender
Calendar.calendar() gibt den Jahreskalender zurück.
print(calendar.calendar(2019))
# 2019
#
# 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
#
print(type(calendar.calendar(2019)))
# <class 'str'>
Mit dem Parameter m können Sie die Anzahl der pro Zeile auszugebenden Monate angeben. Voreingestellt sind drei Monate pro Zeile (= drei Spalten). Außerdem können Sie mit dem Parameter c die Anzahl der Leerzeichen zwischen den Monaten angeben.
Obwohl im folgenden Beispiel weggelassen, können Sie die Breite von Zeilen und Spalten innerhalb jedes Monats mit w- und l-Parametern wie Calendar.month() angeben.
print(calendar.calendar(2019, c=3, m=4))
# 2019
#
# January February March April
# Mo Tu We Th Fr Sa Su 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 1 2 3 4 5 6 7
# 7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10 8 9 10 11 12 13 14
# 14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17 15 16 17 18 19 20 21
# 21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24 22 23 24 25 26 27 28
# 28 29 30 31 25 26 27 28 25 26 27 28 29 30 31 29 30
#
# May June July August
# Mo Tu We Th Fr Sa Su 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 1 2 1 2 3 4 5 6 7 1 2 3 4
# 6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11
# 13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18
# 20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25
# 27 28 29 30 31 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 31
#
# September October November December
# Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
# 1 1 2 3 4 5 6 1 2 3 1
# 2 3 4 5 6 7 8 7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8
# 9 10 11 12 13 14 15 14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15
# 16 17 18 19 20 21 22 21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22
# 23 24 25 26 27 28 29 28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29
# 30 30 31
#
Derselbe String kann mit Calendar.prcal() ausgegeben werden. Die Ausgabe entfällt hier.
Stellen Sie den ersten Tag der Woche ein
Wie in den vorherigen Beispielen haben Kalender standardmäßig den Montag als ersten Tag der Woche.
Sie können den ersten Tag der Woche mit Calendar.setfirstweekday() festlegen.
calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.month(2019, 1))
# January 2019
# 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
#
kalender.MONTAG und kalender.SONNTAG sind Aliase, wobei MONTAG 0 und SONNTAG 6 ist. Sie können einen ganzzahligen Wert für kalender.setfirstweekday() angeben.
Sie können die aktuellen Einstellungen mit Calendar.firstweekday() überprüfen.
print(calendar.MONDAY)
# 0
print(calendar.SUNDAY)
# 6
calendar.setfirstweekday(0)
print(calendar.month(2019, 1))
# 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
#
print(calendar.firstweekday())
# 0
Ändern Sie Gebietsschema und Namen von Wochentagen
Wochentagsnamen hängen vom Gebietsschema ab.
Indem Sie ein Objekt „calendar.LocaleTextCalendar“ mit dem Gebietsschema erstellen und seine verschiedenen Methoden aufrufen, können Sie Kalender mit Wochentagsnamen ausgeben, die diesem Gebietsschema entsprechen. Im Beispiel unten ist es auf Deutsch eingestellt.
ltc_de = calendar.LocaleTextCalendar(locale='de_de')
print(ltc_de.formatmonth(2019, 1))
# Januar 2019
# Mo Di Mi Do Fr Sa So
# 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.LocaleTextCalendar verfügt über die folgenden Methoden. Die Parameter w und l können für einen Monatskalender und die zusätzlichen Parameter c und m für einen Jahreskalender angegeben werden.
- formatmonth(): Gibt eine monatliche Kalenderzeichenfolge zurück
- prmonth(): Druckt einen Monatskalender
- formatyear(): Gibt eine jährliche Kalenderzeichenfolge zurück
- pryear(): Druckt einen Jahreskalender
Beachten Sie, dass die Breite von Double-Byte-Zeichen nicht berücksichtigt wird.
ltc_ja = calendar.LocaleTextCalendar(locale='ja_jp')
print(ltc_ja.formatmonth(2019, 1))
# 1月 2019
# 月 火 水 木 金 土 日
# 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
#
Kalender als HTML-Tabelle abrufen/ausgeben
Sie können den Kalender als HTML-Tabelle erhalten, indem Sie ein Objekt „calendar.HTMLCalendar“ erstellen und die verschiedenen Methoden aufrufen.
hc = calendar.HTMLCalendar()
Monatskalender
Verwenden Sie formatmonth() für einen Monatskalender. Mit dem Parameter withyear können Sie festlegen, ob das Jahr in der Kopfzeile angezeigt werden soll (Standard:True).
print(hc.formatmonth(2019, 1, withyear=False))
# <table border="0" cellpadding="0" cellspacing="0" class="month">
# <tr><th colspan="7" class="month">January</th></tr>
# <tr><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><th class="sun">Sun</th></tr>
# <tr><td class="noday"> </td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td><td class="sun">6</td></tr>
# <tr><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td><td class="sun">13</td></tr>
# <tr><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td><td class="sun">20</td></tr>
# <tr><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td><td class="sun">27</td></tr>
# <tr><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="thu">31</td><td class="noday"> </td><td class="noday"> </td><td class="noday"> </td></tr>
# </table>
#
print(type(hc.formatmonth(2019, 1)))
# <class 'str'>
Jahreskalender
Verwenden Sie formatyear() für einen Jahreskalender. Sie können die Anzahl der anzuzeigenden Monate pro Zeile mit dem Breitenparameter angeben (Standard:3).
Die Ausgabe entfällt hier.
print(hc.formatyear(2019, width=4))
CSS-Klassen festlegen
Wie in den vorherigen Beispielen zu sehen, werden CSS-Klassen für jeden Wochentag festgelegt.
Die Klassennamen werden als Liste im cssclasses-Attribut gespeichert. Sie können Klassennamen ändern, indem Sie eine neue Liste zuweisen. Wenn Sie formatmonth() oder formatyear() nach der Änderung aufrufen, können Sie HTML mit neuen Klassennamen erhalten.
print(hc.cssclasses)
# ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
hc.cssclasses = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat blue', 'sun red']
Seit Python 3.7 wurden auch CSS-Klassenattribute für Monate, Jahre und nicht vorhandene Tage hinzugefügt. Diese können auch auf neue Werte geändert werden.
print(hc.cssclass_month)
# month
print(hc.cssclass_year)
# year
print(hc.cssclass_noday)
# noday
Stellen Sie den ersten Tag der Woche ein
Sie können den ersten Tag der Woche mit dem firstweekday-Parameter von Calendar.HTMLCalendar() angeben.
hc_sun = calendar.HTMLCalendar(firstweekday=6)
print(hc_sun.formatmonth(2019, 1))
# <table border="0" cellpadding="0" cellspacing="0" class="month">
# <tr><th colspan="7" class="month">January 2019</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"> </td><td class="noday"> </td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td></tr>
# <tr><td class="sun">6</td><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td></tr>
# <tr><td class="sun">13</td><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td></tr>
# <tr><td class="sun">20</td><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td></tr>
# <tr><td class="sun">27</td><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="thu">31</td><td class="noday"> </td><td class="noday"> </td></tr>
# </table>
#
Beachten Sie, dass „calendar.setfirstweekday()“ nicht funktioniert.
Ändern Sie Gebietsschema und Namen von Wochentagen
Wenn Sie das Gebietsschema ändern möchten, erstellen Sie ein Objekt „calendar.LocaleHTMLCalendar“. Dieselben Methoden werden für das oben beschriebene Objekt „calendar.HTMLCalendar“ bereitgestellt.
lhc = calendar.LocaleHTMLCalendar(firstweekday=6, locale='ja_jp')
print(lhc.formatmonth(2019, 1))
# <table border="0" cellpadding="0" cellspacing="0" class="month">
# <tr><th colspan="7" class="month">1月 2019</th></tr>
# <tr><th class="sun">日</th><th class="mon">月</th><th class="tue">火</th><th class="wed">水</th><th class="thu">木</th><th class="fri">金</th><th class="sat">土</th></tr>
# <tr><td class="noday"> </td><td class="noday"> </td><td class="tue">1</td><td class="wed">2</td><td class="thu">3</td><td class="fri">4</td><td class="sat">5</td></tr>
# <tr><td class="sun">6</td><td class="mon">7</td><td class="tue">8</td><td class="wed">9</td><td class="thu">10</td><td class="fri">11</td><td class="sat">12</td></tr>
# <tr><td class="sun">13</td><td class="mon">14</td><td class="tue">15</td><td class="wed">16</td><td class="thu">17</td><td class="fri">18</td><td class="sat">19</td></tr>
# <tr><td class="sun">20</td><td class="mon">21</td><td class="tue">22</td><td class="wed">23</td><td class="thu">24</td><td class="fri">25</td><td class="sat">26</td></tr>
# <tr><td class="sun">27</td><td class="mon">28</td><td class="tue">29</td><td class="wed">30</td><td class="thu">31</td><td class="noday"> </td><td class="noday"> </td></tr>
# </table>
#
Holen Sie sich Kalender als Liste
Liste der Nummern
Sie können einen Kalender als zweidimensionale Liste (eine Liste von Listen) erhalten, deren Elemente ganze Zahlen von Datumsangaben mit Calendar.monthcalendar() sind. Nicht vorhandene Tage werden auf 0 gesetzt.
Dieses Beispiel verwendet pprint.
import calendar
import pprint
pprint.pprint(calendar.monthcalendar(2019, 1))
# [[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]]
Sie können den ersten Tag der Woche mit Calendar.setfirstweekday() angeben.
calendar.setfirstweekday(6)
pprint.pprint(calendar.monthcalendar(2019, 1))
# [[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, 0, 0]]
Sie können dieselbe Liste erhalten, indem Sie ein Objekt „calendar.Calendar“ erstellen und die Methode „monthdayscalendar()“ aufrufen. In dieser Methode können Sie den ersten Wochentag mit dem Parameter firstweekday des Konstruktors Calendar.Calendar() angeben.
c = calendar.Calendar(firstweekday=0)
pprint.pprint(c.monthdayscalendar(2019, 1))
# [[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]]
Sie können den Jahreskalender mit der Methode yeardayscalendar() des Objekts „calendar.Calendar“ abrufen. Wie bei reinem Text und HTML können Sie mit dem Parameter width die Anzahl der Monate pro Zeile angeben.
pprint.pprint(c.yeardayscalendar(2019), depth=2)
# [[[...], [...], [...]],
# [[...], [...], [...]],
# [[...], [...], [...]],
# [[...], [...], [...]]]
pprint.pprint(c.yeardayscalendar(2019, width=4), depth=2)
# [[[...], [...], [...], [...]],
# [[...], [...], [...], [...]],
# [[...], [...], [...], [...]]]
Liste der Tupel
Sie können einen Kalender als Liste von Tupeln mit der Methode monthdays2calendar() von Calendar.Calendar erhalten. Jedes Tupel hat einen Wert von (Datum, Tag), und ein nicht vorhandenes Datum ist 0.
pprint.pprint(c.monthdays2calendar(2019, 1))
# [[(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)]]
Verwenden Sie yeardays2calendar() für den Jahreskalender. Auf Beispiele wird hier verzichtet.
Liste von datetime.date
Sie können einen Kalender als Liste von datetime.date mit der Methode monthdatescalendar() von Calendar.Calendar erhalten.
Die erste und letzte Woche des Monats enthalten die Daten des vorangegangenen und des folgenden Monats.
pprint.pprint(c.monthdatescalendar(2019, 1))
# [[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)]]
Verwenden Sie yeardatescalendar() für einen Jahreskalender. Auf Beispiele wird hier verzichtet.
Auf der Kommandozeile
Das Kalendermodul ist auch über die Befehlszeile verfügbar.
Rufen Sie den Kalender als Modul mit dem Befehl python (oder python3 in einigen Umgebungen) mit der Option -m auf.
python3 -m calendar 2019 1
# 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
Verschiedene Optionen sind ebenfalls verfügbar.
python3 -m calendar -h
# usage: calendar.py [-h] [-w WIDTH] [-l LINES] [-s SPACING] [-m MONTHS]
# [-c CSS] [-L LOCALE] [-e ENCODING] [-t {text,html}]
# [year] [month]
#
# positional arguments:
# year year number (1-9999)
# month month number (1-12, text only)
#
# optional arguments:
# -h, --help show this help message and exit
# -L LOCALE, --locale LOCALE
# locale to be used from month and weekday names
# -e ENCODING, --encoding ENCODING
# encoding to use for output
# -t {text,html}, --type {text,html}
# output type (text or html)
#
# text only arguments:
# -w WIDTH, --width WIDTH
# width of date column (default 2)
# -l LINES, --lines LINES
# number of lines for each week (default 1)
# -s SPACING, --spacing SPACING
# spacing between months (default 6)
# -m MONTHS, --months MONTHS
# months per row (default 3)
#
# html only arguments:
# -c CSS, --css CSS CSS to use for page