Pandasで土日・祝日・平日・休日・連休を取り扱う
ここでは、まいどおなじみの「python-shukujitsu」ライブラリを使っていきます。
「毎日」と「月~金」
※ freq="D"は毎日、freq="B"は月~金という意味です。
「祝日」と「平日」
「土日」と「休日」
「3連休以上」
Consecutive 3+ daysoff in Pandas
cronで土日・祝日以外の平日を指定する方法
結論:この「shukujitsu」コマンドを使ってください。
まずはインストール
RedHatやCentOS、Amazon Linuxなどではyumを使って3ステップ、
$ sudo yum install -y curl $ curl -fsSL https://sakurai-youhei.github.io/python-shukujitsu/rpm/python-shukujitsu.repo | sudo tee /etc/yum.repos.d/python-shukujitsu.repo $ sudo yum install -y python-shukujitsu
$ sudo apt install -y curl gpg $ curl -fsSL https://sakurai-youhei.github.io/python-shukujitsu/gpg | sudo apt-key add - $ curl -fsSL https://sakurai-youhei.github.io/python-shukujitsu/deb/python-shukujitsu.list | sudo tee /etc/apt/sources.list.d/python-shukujitsu.list $ sudo apt update $ sudo apt install -y python-shukujitsu
これで祝日判定のキモとなる「shukujitsu」コマンドが利用できるようになります。
次に基本的な使い方
この「shukujitsu」コマンドは日付を渡すと、その日が祝日の場合にはそのままの日付、もしくはnオプションで該当する祝日の名前を出力します。
$ shukujitsu 2020/7/24 2020/7/24 $ shukujitsu -n 2020/7/24 スポーツの日
そして逆にその日が祝日でなければ、コマンドは何も出力せずに異常終了します。この特性と、Linuxコマンドを連続して使うには - Qiita で紹介されている連続コマンドの書き方、「コマンド1 || コマンド2」を組み合わせると、
$ shukujitsu -n 2020/7/24 || echo 祝日ではない スポーツの日
$ shukujitsu -n 2020/7/22 || echo 祝日ではない 祝日ではない
という様にコマンドの実行を祝日ではない場合に制限できます。また日付の部分にはUnixタイムスタンプも指定できますので、その瞬間を祝日かどうか判別しながらコマンドを実行するには、
$ shukujitsu -n `date +%s` || echo 祝日ではない 祝日の名前か「祝日ではない」と表示される
と書きます。
最後にcrontabへの書き方
コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。
この辺りの情報、特にdateコマンドの引数に含まれるパーセント記号の扱いに注意しながら、土日・祝日以外の平日にジョブをスケジュールするにはcrontabへの記述は以下のようになります。
↓↓ cronで土日・祝日以外の平日を指定する方法 ↓↓
# 祝日ではない月曜から金曜の日本時間午前6時30分に/path/to/commandを実行する CRON_TZ=Asia/Tokyo
30 6 * * 1-5 /usr/bin/shukujitsu -n `/bin/date +\%s` || /path/to/command
運用上の注意事項
この「shukujitsu」コマンド、内閣府が公開しているデータを祝日判定の元としている都合上、2020年11月28日時点では2021年末までの祝日判定にしか対応していません。
今後、内閣府がその祝日データを更新すれば、それに追従した更新版パッケージも公開する予定ですので、3カ月に1回くらいは「yum update」や「apt update && apt upgrade」でお使いの環境にインストールしたパッケージを更新するようにしてください。そうすれば2021年中には2022年の祝日判定も可能になっているはずです。
内閣府がCSV形式の国民の祝日データを公開している
のを見つけて、GitHubの最終面接も残念な結果に終わったことだし、そのデータをPythonでラップするライブラリを勢いでざっと書いてみました。名前は日本語が読める人に覚えやすいようにpython-shukujitsu(パイソン祝日)にしました。
作り始めはどういった使い方ができるライブラリにしようかと悩んだのですが、結局はPythonの祝日ライブラリでデファクトスタンダードだと思われるpython-holidaysと同じような使い方ができるように作りました。
そしてREADMEにも書きましたが、使い方はちょー簡単。
import shukujitsu jp_holidays = shukujitsu.Japan()
こんな感じで取得した「jp_holidays」は、キーが日付で値が祝日名の辞書みたいなオブジェクトになっています。そのオブジェクトは以下のように雑多な書式・形式の日付で引けますし、スライスすることも可能となっています。
'2014-01-01' in jp_holidays # True '1/1/2014' in jp_holidays # True 1388597445 in jp_holidays # True ※Unixタイムスタンプ jp_holidays['2014-01-01': '2014-01-03'] # [date(2014, 1, 1)]
またpython-holidaysにはないオリジナルの機能として、shukujitsu(祝日)というコマンドラインインターフェースを準備しました。これ、手前味噌なんですが、かなりの可能性を感じさせる使い方ができます。
pip3 install python-shukujitsu
というコマンドでpython-shukujitsu(パイソン祝日)をインストールすると、シェル上で条件分岐やテキストデータをフィルタするためのshukujitsu(祝日)というコマンドが一緒に使えるようになります。これを使えば、例えば今日が祝日かどうかによって処理を分ける場合にも、
$ shukujitsu `date +%s` > /dev/null && echo 今日は祝日 || echo 今日は祝日じゃない
みたいなワンライナーで一発です。これ、システムのバッチ処理なんかでも活躍しそうでしょ?そして何より祝日の判別は国のデータを元にしているので精度もばっちりなはずです!
ただひとつの難点は、未来の祝日判別は2020年11月20日時点で2021年末までしか対応していないところです。これはそもそも国の元データが令和3年(2021年)までしか存在していないので仕方ありません。一方で過去の祝日判別については元データが昭和30年(1955年)から存在しているので、データ分析用途などにも問題なく利用できると思います。
さて本エントリ、特にオチはありません。どうか私奴(わたくしめ)のpython-shukujitsu(パイソン祝日)を皆様で愛でてやってください。
あー、命(人生)を燃やして最高のサポートを!世界最高のデベロッパーたちに!って思ってたのに。。。その気持ちを供養するための昇華活動です。まぁでも、自分よりも良い人が時を同じくした「ただ、それだけのこと(プフ)」だったんです。でも「勝たなきゃダメなんだ・・・・・・!」ですよね、トネガワさん。
でも冗談抜きに、面接でお話ししたドイツのティンカーベルさんは、本当に一緒に仕事がしたいと思える素晴らしい方だった一方、彼の「See you again」に応えられなかった自分の至らなさには本当に残念に思います。
でもまぁまぁ仕方ないさ。さぁ、切り替えていこう!