Appleのカレンダーライブラリの祝祭日を処理する

当初はGoogleCalendarの日本の祝祭日を処理しようと思っていたのだが、Appleが公開しているiCalの方が良いらしい。

必要なライブラリ
  1. icalendar
  2. dateutil

(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)