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()
以上です。