Appleのカレンダーライブラリの祝祭日を処理する
当初はGoogleCalendarの日本の祝祭日を処理しようと思っていたのだが、Appleが公開しているiCalの方が良いらしい。
必要なライブラリ
(httpでデータを取得する場合にはurllib2等が必要)
iCalendar形式についてはこちらを参照
振替休日については、iCal側に登録されているものしか出せないが現時点で2030年までの分が登録されている。その他の祝祭日(ハッピーマンデーも含め)についてはRRULEというもので条件が指定されている。それを処理する為にdateutilのrruleを使用する
from urllib2 import urlopen from dateutil import rrule, parser from icalendar import Calendar class Holiday: def __init__(self): res = urlopen('http://ical.mac.com/ical/Japanese32Holidays.ics') self.calendar = cal = Calendar.from_string(res.read()) def getList(self, year, month): list = [] for i in self.calendar.walk('vevent'): dtstart = parser.parse(str(i.get('dtstart'))) if dtstart.month is not month: continue h = None if not i.get('rrule'): if dtstart.year != year: continue h = dtstart else: for tmp in rrule.rrulestr(str(i.get('rrule')), dtstart=dtstart): if tmp.year == year: h = tmp break list.append({'datetime':h, 'summary':i.get('summary')}) return list
以下のスクリプトを用意
holiday = Holiday() m = 5 for y in xrange(2010, 2015 + 1): h = holiday.getList(y, m) if not h: continue print "[%d-%d]" % (y, m) h.sort() for i in h: print '%s %s' % (i['datetime'].strftime('%Y-%m-%d %a'), i['summary']) print
実行結果
[2010-5] 2010-05-03 Mon 憲法記念日(Constitution Memorial Day) 2010-05-04 Tue みどりの日 (Greenery Day) 2010-05-05 Wed こどもの日 (Children's Day) [2011-5] 2011-05-03 Tue 憲法記念日(Constitution Memorial Day) 2011-05-04 Wed みどりの日 (Greenery Day) 2011-05-05 Thu こどもの日 (Children's Day) [2012-5] 2012-05-03 Thu 憲法記念日(Constitution Memorial Day) 2012-05-04 Fri みどりの日 (Greenery Day) 2012-05-05 Sat こどもの日 (Children's Day) [2013-5] 2013-05-03 Fri 憲法記念日(Constitution Memorial Day) 2013-05-04 Sat みどりの日 (Greenery Day) 2013-05-05 Sun こどもの日 (Children's Day) 2013-05-06 Mon 振替休日 (Substitute Holiday) [2014-5] 2014-05-03 Sat 憲法記念日(Constitution Memorial Day) 2014-05-04 Sun みどりの日 (Greenery Day) 2014-05-05 Mon こどもの日 (Children's Day) 2014-05-06 Tue 振替休日 (Substitue Holiday) [2015-5] 2015-05-03 Sun 憲法記念日(Constitution Memorial Day) 2015-05-04 Mon みどりの日 (Greenery Day) 2015-05-05 Tue こどもの日 (Children's Day) 2015-05-06 Wed 振替休日 (Substitute Holiday)