ライブラリ: calendar

Pythonの「calendar」というライブラリについてご紹介します。

import calendar

「calendar」は、名前のとおりカレンダー情報を扱うためのライブラリです。中身はとてもシンプルで、「何年何月」という形で特定の月を指定すればその月の日・曜日情報を返す、といった機能がメインです。

もっと広い範囲で日付や時間の情報を扱いたい場合は「datetime」や「time」といったライブラリが便利です。

以下、主な機能を見ていきます。

month()

imort calendar

print calendar.month(2013, 8)
# 次のとおり表示される
#     August 2013
# 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

month()は、年と月を整数で渡せば、その月のカレンダーを文字列として返してくれる関数です。

print type(calendar.month(2013, 8)).__name__
# strと表示される

返ってくる中身は通常の文字列です。

Calendar

c1 = calendar.Calendar()

print type(c1).__name__  # Calendar

カレンダーをひとつ表示するだけであればmonth()で十分ですが、ちょっと複雑な(といってもシンプルですが)カレンダー情報を扱うのであればCalendarクラスを利用するのが便利です。

for ele in c1.iterweekdays():
    print ele,
# 0 1 2 3 4 5 6 と表示される

インスタンスメソッドiterweekdays()は、曜日を表す0から6の数字を生成してくれるイテレータです。0が月曜日、6が日曜日に対応しています。

c2 = calendar.Calendar(firstweekday=5)
for ele in c2.iterweekdays():
    print ele,
# 5 6 0 1 2 3 4 と表示される

始まりの曜日はデフォルトでは月曜日となっていますが、変えたい場合はオプションfirstweekdayが利用できます。

for ele in c1.itermonthdays2(2013, 8):
    print '(%2d,%2d)' % (ele[0], ele[1]),
    if ele[1] == 6:
        print
# 次のとおり表示される
# ( 0, 0) ( 0, 1) ( 0, 2) ( 1, 3) ( 2, 4) ( 3, 5) ( 4, 6)
# ( 5, 0) ( 6, 1) ( 7, 2) ( 8, 3) ( 9, 4) (10, 5) (11, 6)
# (12, 0) (13, 1) (14, 2) (15, 3) (16, 4) (17, 5) (18, 6)
# (19, 0) (20, 1) (21, 2) (22, 3) (23, 4) (24, 5) (25, 6)
# (26, 0) (27, 1) (28, 2) (29, 3) (30, 4) (31, 5) ( 0, 6)

itermonthdays2()は、年・月を渡すとその月のすべての(日, 曜日)を返してくれるメソッドです。

その月の「最初の日を含む週の最初の日」から「最後の日を含む週の最後の日」までの日付が返ってくるため、要素数は必ず7の倍数です。また、その月に属さない日の日付部分はすべて0となります。

名前に「2」のつかないitermonthdays()というメソッドもあって、こちらは曜日情報を含まない日付の部分のみをリストで返します。

for ele in c1.itermonthdates(2013, 8):
    print ele
# 次のとおり表示される
# 2013-07-29
# 2013-07-30
# 2013-07-31
# 2013-08-01
# 2013-08-02
# ...
# 2013-08-31
# 2013-09-01
# print type(ele).__name__  # datetime.date

itermonthdays2()は各要素を(日, 曜日)というフォーマットで返しましたが、itermonthdates()は各要素をdatetimeライブラリのdatetime.date型のインスタンスとして返します。

c3 = c1.monthdays2calendar(2013, 8)
for week in c3:
    print week
# 次のとおり表示される
# [(0, 0), (0, 1), (0, 2), (1, 3), (2, 4), (3, 5), (4, 6)]
# [(5, 0), (6, 1), (7, 2), (8, 3), (9, 4), (10, 5), (11, 6)]
# [(12, 0), (13, 1), (14, 2), (15, 3), (16, 4), (17, 5), (18, 6)]
# [(19, 0), (20, 1), (21, 2), (22, 3), (23, 4), (24, 5), (25, 6)]
# [(26, 0), (27, 1), (28, 2), (29, 3), (30, 4), (31, 5), (0, 6)]

itermonthdays2()はすべての日付をフラットに返しましたが、monthdays2calendar()は、itermonthdays2()が返す要素を週単位に分けて返してくれます。

c4 = c1.monthdatescalendar(2013, 8)
print len(c4)  # 5
print c4[0][0]  # 2013-07-29

monthdays2calendar()と同様に、datetime.dateを週単位にまとめて返してくれるmonthdatescalendar()というメソッドもあります。週単位にまとめるのでlen(c4)は5(5週)となっています。

メインとなるのはこのCalendarクラスですが、その他にも、カレンダーを表示することに特化したTextCalendar、HTMLCalendarというクラスが用意されています。

TextCalendar

c5 = calendar.TextCalendar()
print c5.formatmonth(2013, 8, w=3)
print c5.formatyear(2013)

TextCalendarは、カレンダー情報をテキストとして出力するためのクラスです。formatmonth()は月単位、formatyear()は年単位で次のような整形されたカレンダーを出力することができます。

#         August 2013
# 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

HTMLCalendar

TextCalendarがプレーンテキストに表示するのに対し、HTMLカレンダーは、タグ付きのHTMLフォーマットのカレンダーを出力します。

FILEOUT = 'sample_calendar.html'

c3 = calendar.HTMLCalendar()

f = open(FILEOUT, 'w')
f.write(c3.formatmonth(2013, 8))
f.close()

以上です。

参考