【Perl, Python】日本の祝日の一覧を取得する


とかく日本は祝日の多い国である。しかも祝日となる日付は毎年異なり、その法則も他国のように単純なものではない。

2007 年(平成 19 年)からは国民の祝日が合計 15 日となった。これは先進国では最多であり、「ワーカホリック」ともいわれる日本の意外な一面でもある。
http://ja.wikipedia.org/wiki/国民の祝日

Perl の場合

Perl で祝日判定を行うならば Calendar::Japanese::Holiday モジュールが使いやすい。

Calendar::Japanese::Holiday – search.cpan.org
http://search.cpan.org/~kztomita/Calendar-Japanese-Holiday-0.03/lib/Calendar/Japanese/Holiday.pm

Perl 祝日名の取得 – とみぞーノート
http://wiki.bit-hive.com/tomizoo/pg/Perl%20%BD%CB%C6%FC%CC%BE%A4%CE%BC%E8%C6%C0

インストールは次のコマンドを打つだけだ。

Windows(ActivePerl)の場合

C:\> ppm install Calendar::Japanese::Holiday

Linux、Mac OS X 等の場合

$ cpan -i Calendar::Japanese::Holiday

サンプル

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use feature qw! say !;
use Calendar::Japanese::Holiday;
use YAML;
binmode STDOUT => ":utf8";

# 2009年5月の祝日一覧
say Dump getHolidays( 2009, 5 );
# 第3引数に真値を指定すると振替休日をも返す
say Dump getHolidays( 2009, 5, 1 );
# 特別な祝日にも対応
say Dump getHolidays( 1993, 6 );

# 指定した年月日が祝日かどうかの判定
say isHoliday( 2010, 1, 1 ) // "祝日ではありません";
say isHoliday( 2010, 7, 7 ) // "祝日ではありません";

実行例

$ perl testHoliday.pl
---
3: 憲法記念日
4: みどりの日
5: こどもの日

---
3: 憲法記念日
4: みどりの日
5: こどもの日
6: 振替

---
9: 皇太子徳仁親王の結婚の儀

元日
祝日ではありません

getHolidays 関数は指定した年月に含まれる祝日のリストをハッシュリファレンスの形で返す。isHoliday 関数は指定した年月日の祝日であればその名を、そうでなければ未定義値を返す。

Python の場合

VBA 用のコードとして有名な祝日判定用マクロを Python に移植したスクリプトが使える1

AddinBox(祝日マクロ)
http://www.h3.dion.ne.jp/~sakatsu/holiday_logic5.htm#Python

載せてあるスクリプトを jholiday.py の名前で保存して使えばよい……のだが、そのままではうまく動かなかったので、スクリプトの 47 行目、225 行目を次のように修正した。

変更前

import datetime
print n.encode('euc-jp')

変更後

import datetime, math
print n

使用例

#!/usr/bin/env python
#encoding:utf-8
import calendar, jholiday

def _test1( y, m ):
    for d in xrange( calendar.monthrange( y, m )[1] ):
        n = jholiday.holiday_name( y, m, d + 1 )
        if n:
            print "%d: %s" % ( d + 1, n )

def _test2( y, m, d ):
    n = jholiday.holiday_name( y, m, d )
    if n:
        print n
    else:
        print u"祝日ではありません"

# 2009年5月の祝日一覧
_test1( 2009, 5 )
print
# 特別な祝日にも対応
_test1( 1993, 6 )
print
# 指定した年月日が祝日かどうかの判定
_test2( 2010, 1, 1 )
_test2( 2010, 7, 7 )

実行例

C:\> python testHoliday.py
3: 憲法記念日
4: みどりの日
5: こどもの日
6: 振替休日

9: 皇太子徳仁親王の結婚の儀

元日
祝日ではありません

  1. このページには Perl 用のスクリプトも存在するが、インストールやインターフェイスの簡便さ等の点で、前述の Calendar::Japanese::Holiday モジュールの方が優れている。 

コメントを残す