日曆 calendar
Python 的標準函式「calendar」提供處理日期相關的實用方法,同時也可以將日曆輸出成為常見的日曆格式。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
calendar 常用方法
下方列出幾種 calendar 模組常用的方法 ( 參考 Python 官方文件:calendar ):
方法 | 參數 | 說明 |
---|---|---|
Calendar() | 建立一個 calendar 對象 | |
TextCalendar() | 建立一個可以印出與使用的日曆 | |
HTMLCalendar() | 建立一個包含 HTML 格式的日曆 | |
setfirstweekday() | n | 設定日曆裡,每個星期的第一天是星期幾 ( 星期一為 0,星期天為 6 ) |
firstweekday() | 回傳每個星期第一天的數值 | |
isleap() | year | 判斷 year 年份是否為閏年,回傳 True 或 False |
leapdays() | y1, y2 | 計算 y1 年到 y2 年之間共包含幾個閏年 |
weekday() | year, month, day | 回傳某年某月的某一天是星期幾 ( 星期一是 0 ) |
weekheader() | n | 回傳星期幾的開頭縮寫,n 的範圍是 1~3 |
monthrange() | year, month | 回傳某年某月的第一天是星期幾 ( 星期一為 0 ),以及這個月的天數 |
monthcalendar() | year, month | 回傳一個日曆的二維串列 |
month() | year, month, w=0, l=0 | 回傳一個格式化的月份字串 |
prmonth() | year, month, w=0, l=0 | 等同 print(calendar.month()) |
calendar() | year, w=0, l=0, c=6, m=3 | 回傳一個格式化後一整年的月曆字串 |
prcal() | year, w=2, l=1, c=6, m=3 | 等同 print(calendar.calendar()) |
day_name、calendar.day_abbr | 回傳星期一到星期天的名稱或縮寫 | |
month_name、calendar.month_abbr | 回傳 1~12 月的名稱或縮寫 |
import calendar
要使用 calendar 必須先 import calendar 模組,或使用 from 的方式,單獨 import 特定的類型。
import calendar
from calendar import prmonth
Calendar()
calendar.Calendar() 可以建立一個 calendar 對象,calendar 對象可以使用下列幾種方法:
方法 | 說明 |
---|---|
iterweekdays() | 產生一星期 0~6 的迭代物件 |
itermonthdates(year, month) | 產生某年某月的迭代物件,如果該月份不是從星期一開始,會自動上前一個月的後幾天,datetime.date |
itermonthdays(year, month) | 產生一個月份的迭代物件,格式為 0~6,如果該月份不是從星期一開始,會自動補 0 |
itermonthdays2(year, month) | 產生一個月份的迭代物件,格式為 (0,0)~(31,6),如果該月份不是從星期一開始,會自動補 0 |
monthdatescalendar(year, month) | 產生一個月份的二維串列,每個子串列由一週的七天組成,格式為 datetime.date |
monthdayscalendar(year, month) | 產生一個月份的二維串列,每個子串列由一週的七天組成,格式為 0~6 |
monthdays2calendar(year, month) | 產生一個月份的二維串列,每個子串列由一週的七天組成,格式為 (0,0)~(31,6) |
yeardatescalendar(year) | 產生一整年的多維串列,每個子串列由一週的七天組成,格式為 datetime.date |
yeardays2calendar(year) | 產生一整年的多維串列,每個子串列由一週的七天組成,格式為 0~6 |
yeardayscalendar(year) | 產生一整年的多維串列,每個子串列由一週的七天組成,格式為 (0,0)~(31,6) |
import calendar
c = calendar.Calendar()
print(list(c.iterweekdays()))
#[0, 1, 2, 3, 4, 5, 6]
print(list(c.itermonthdates(2021,10)))
# [datetime.date(2021, 9, 27), datetime.date(2021, 9, 28)....
print(list(c.itermonthdays(2021,10)))
# [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]
print(list(c.itermonthdays2(2021,10)))
# [(0, 0), (0, 1), (0, 2), (0, 3), (1, 4), (2, 5).....
print(c.monthdatescalendar(2021,10))
# [[datetime.date(2021, 9, 27), datetime.date(2021, 9, 28).....
print(c.monthdayscalendar(2021,10))
# [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10]......
print(c.monthdays2calendar(2021,10))
# [[(0, 0), (0, 1), (0, 2), (0, 3), (1, 4), (2, 5).....
print(c.yeardatescalendar(2021))
# [[[[datetime.date(2020, 12, 28), datetime.date(2020, 12, 29)....
print(c.yeardayscalendar(2021))
# [[[[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10]....
print(c.yeardays2calendar(2021))
# [[[[(0, 0), (0, 1), (0, 2), (0, 3), (1, 4), (2, 5)....
TextCalendar()
calendar.TextCalendar() 可以建立一個可以印出與使用的日曆,有下列幾種方法:
方法 | 說明 |
---|---|
formatmonth(year, month, w=0, l=0) | 產生格式化後一個月份的日曆,w 和 l 是顯示的寬高 ( 可不填 ) |
prmonth(year, month, w=0, l=0) | 等同 print(formatmonth) |
formatyear(year, month, w=0, l=0, c=6, m=3) | 產生格式化後一個年份的月曆,w 和 l 是顯示的寬高 ( 可不填 ),c 和 m 表示是垂直和水平顯示的列與欄 ( 可不填 ) |
pryear(year, month, w=0, l=0, c=6, m=3) | 等同 print(formatyear) |
import calendar
tc = calendar.TextCalendar()
print(tc.formatmonth(2021,10))
tc.prmonth(2021,10)
'''
October 2021
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(tc.formatyear(2021, c=3, m=4))
tc.pryear(2021, c=3, m=4)
'''
2021
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 1 2 3 4 5 6 7 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 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 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 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
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 1 2 3 4 5 6 1 2 3 4 1
3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8
10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15
17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29
31 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 2 3 4 5 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
27 28 29 30 25 26 27 28 29 30 31 29 30 27 28 29 30 31
'''
HTMLCalendar()
calendar.HTMLCalendar() 可以建立一個包含 HTML 格式的日曆,,有下列幾種方法:
方法 | 說明 |
---|---|
formatmonth(year, month, withyear=True) | 輸出某年裡某個月份的日曆 HTML 表格,withyear 預設 True 表示顯示年份 ( 可不填 ) |
formatmonth(year, width=3) | 輸出某年的月曆 HTML 表格,width 表示一行裡有幾個月,預設 3 ( 可不填 ) |
formatyearpage(year, width=3, css='xxx.css', encoding=None) | 輸出某年的月曆 HTML 網頁程式碼,width 表示一行裡有幾個月,預設 3 ( width、css、encoding 都可不填 ) |
import calendar
html = calendar.HTMLCalendar()
print(html.formatmonth(2021,10))
# 範例網頁:https://jsbin.com/jilexovube/1/edit?html,css,output
import calendar
html = calendar.HTMLCalendar()
print(html.formatyear(2021, width=4))
print(html.formatyearpage(2021, width=4))
# 範例網址:https://jsbin.com/nawepogoti/1/edit?html,css,output
setfirstweekday(n)
calendar.setfirstweekday(n) 可以設定日曆裡,每個星期的第一天是星期幾 ( 星期一為 0,星期天為 6 ),只要是日期物件都可以使用 setfirstweekday 方法設定,例如下方的程式,執行後會將星期五變成日曆的第一天。
import calendar
tc = calendar.TextCalendar()
tc.setfirstweekday(4) # 設定星期五為第一天
tc.prmonth(2021,10)
'''
October 2021
Fr Sa Su Mo Tu We Th
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
'''
firstweekday()
calendar.firstweekday() 使用後會回傳每個星期第一天的數值,如果設定為 0,就會回傳 0。
import calendar
calendar.setfirstweekday(0)
print(calendar.firstweekday()) # 0
isleap(year)
calendar.isleap(year) 可以判斷某一年是否為閏年,回傳 True 或 False。
import calendar
print(calendar.isleap(2020)) # True
print(calendar.isleap(2021)) # False
print(calendar.isleap(2022)) # False
leapdays(y1, y2)
calendar.leapdays(y1, y2) 可以計算 y1 年到 y2 年之間共包含幾個閏年。
import calendar
print(calendar.leapdays(1920, 2020)) # 25 ( 1920~2020 年間,有 25 個閏年 )
weekday(year, month, day)
calendar.weekday(year, month, day) 可以回傳某年某月的某一天是星期幾 ( 星期一從 0 開始 )。
import calendar
print(calendar.weekday(2021,10,1)) # 4 ( 2021/10/1 是星期五 )
weekheader(n)
calendar.weekheader(n) 可以回傳星期幾的開頭縮寫,n 的範圍是 1~3。
import calendar
print(calendar.weekheader(1)) # M T W T F S S
print(calendar.weekheader(2)) # Mo Tu We Th Fr Sa Su
print(calendar.weekheader(3)) # Mon Tue Wed Thu Fri Sat Sun
monthrange(year, month)
calendar.monthrange(year, month) 可以回傳某年某月的第一天是星期幾 ( 星期一為 0 ),以及這個月的天數。
import calendar
print(calendar.monthrange(2021,10))
# (4, 31) 2021 的 10 月有 31 天,10 月第一天是星期五
print(calendar.monthrange(2021,11)) # (0, 30)
# (0, 30) 2021 的 11 月有 30 天,11 月第一天是星期一
monthcalendar(year, month)
calendar.monthcalendar(year, month) 可以回傳一個日曆的二維串列。
import calendar
print(calendar.monthcalendar(2021,10))
# [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17]...
month(year, month, w=0, l=0)
calendar.month(year, month, w=0, l=0) 可以回傳一個格式化的月份字串,效果和 formatmonth 相同。
import calendar
calendar.setfirstweekday(6) # 設定第一天是星期天
print(calendar.month(2021, 10))
'''
October 2021
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
'''
prmonth(year, month, w=0, l=0)
效果等同「print(calendar.month(year, month, w=0, l=0))
」。
calendar(year, w=0, l=0, c=6, m=3)
效果等同「formatyear(year, month, w=0, l=0, c=6, m=3)
」。
prcal(year, w=2, l=1, c=6, m=3)
效果等同「print(calendar.calendar(year, w=0, l=0, c=6, m=3))
」。
day_name、calendar.day_abbr
calendar.day_name、calendar.day_abbr 使用後會回傳星期一到星期天的名稱或縮寫。
import calendar
print(list(calendar.day_name))
# ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
print(list(calendar.day_abbr))
# ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
month_name、calendar.month_abbr
calendar.month_name、calendar.month_abbr 使用後會回傳 1~12 月的名稱或縮寫 ( 產生後的第一個值會是空值 )。
import calendar
print(list(calendar.month_name))
# ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
print(list(calendar.month_abbr))
# ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~