iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Software Development

跟著 OXXO 一起學 Python系列 第 41

( Day 19.3 ) Python 日曆 calendar

  • 分享至 

  • xImage
  •  

Python 的標準函式「calendar」提供處理日期相關的實用方法,同時也可以將日曆輸出成為常見的日曆格式。

原文參考:日曆 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

Python 教學 - 日曆 calendar

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

Python 教學 - 日曆 calendar

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']

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 19.2 ) Python 時間處理 time
下一篇
( Day 20.1 ) Python 使用正規表達式 re
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言