らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

Python で営業日を取得出来るライブラリ「jpbizday」を公開

日本の祝日情報を取得する Python ライブラリは幾つかありますが、動作は以下に大別出来ると思います。

  1. オンラインで動作するもの (「Google カレンダー」や「公共機関が出しているカレンダー」からネットワーク経由で情報取得するもの)
  2. オフラインで動作するもの

どちらも一長一短ですが、「1. オンライン」の場合は当然、オンライン側の URL や提供データのフォーマット変更などの影響を受けてしまいます。 「2. オフライン」タイプのライブラリとしては jpholiday という、素晴らしいライブラリが公開されています。 こちらのライブラリを利用する形で (祝日では無く) 営業日情報を取得する jpbizday というライブラリを作成しました。

「営業日」とは

jpbizday では「営業日」を以下のように判定しています。

  • 営業日とは
    • 土日では無いこと
    • 祝日では無いこと
    • 1/1 ~ 1/3 では無いこと

企業や団体によっては「上記以外であっても、営業日として扱う」ケースもあると思います。 そういった場合は jpgizday だけで判定させるのでは無く、アプリケーション側に「独自の例外ロジック」を設けて営業日判定する… という実装を想定しています。

インストール

他のライブラリ同様、pip でインストールします。 jpholiday に依存していますので、同時に jpholiday もインストールされます。

pip install jpbizday

指定日が「営業日か?」を判定する

jpbizday.is_bizday() で指定された日付が「営業日か?否か?」を判定することが出来ます。

> import jpbizday
> import datetime
> jpbizday.is_bizday(datetime.date(2020, 1, 1))
False
> jpbizday.is_bizday(datetime.date(2020, 1, 6))
True

指定年の営業日を取得する

jpbizday.year_bizdays() で指定された年の営業日一覧をリスト形式で取得することが出来ます。

> jpbizday.year_bizdays(2020)
[datetime.date(2020, 1, 6),
 datetime.date(2020, 1, 7),
 datetime.date(2020, 1, 8),
 datetime.date(2020, 1, 9),
 datetime.date(2020, 1, 10),
 datetime.date(2020, 1, 14),
 datetime.date(2020, 1, 15),
    .
    .
    .
 datetime.date(2020, 12, 23),
 datetime.date(2020, 12, 24),
 datetime.date(2020, 12, 25),
 datetime.date(2020, 12, 28),
 datetime.date(2020, 12, 29),
 datetime.date(2020, 12, 30),
 datetime.date(2020, 12, 31)]

このリストの長さを取得することで「指定年の営業日の合計日数」を取得することが出来ます。

> len(jpbizday.year_bizdays(2020))
259

指定月の営業日を取得する

jpbizday.month_bizdays() で指定された次の営業日一覧をリスト形式で取得することが出来ます。

> jpbizday.month_bizdays(2020, 1)
[datetime.date(2020, 1, 6),
 datetime.date(2020, 1, 7),
 datetime.date(2020, 1, 8),
 datetime.date(2020, 1, 9),
 datetime.date(2020, 1, 10),
 datetime.date(2020, 1, 14),
 datetime.date(2020, 1, 15),
 datetime.date(2020, 1, 16),
 datetime.date(2020, 1, 17),
 datetime.date(2020, 1, 20),
 datetime.date(2020, 1, 21),
 datetime.date(2020, 1, 22),
 datetime.date(2020, 1, 23),
 datetime.date(2020, 1, 24),
 datetime.date(2020, 1, 27),
 datetime.date(2020, 1, 28),
 datetime.date(2020, 1, 29),
 datetime.date(2020, 1, 30),
 datetime.date(2020, 1, 31)]

年の場合と同様、このリストの長さを習得することで「指定月の営業日の合計日数」を取得することが出来ます。

> len(jpbizday.month_bizdays(2020, 1))
19

指定月の最初の営業日を取得する

jpbizday.first_bizday() で指定月の 最初の 営業日を取得することが出来ます。

> jpbizday.first_bizday(2020, 1)
datetime.date(2020, 1, 6)

「今月の、最初の営業日を取得したい」といった場合は以下のように実行出来ます。

> jpbizday.first_bizday(datetime.datetime.today())
datetime.date(2020, 2, 3)

指定月の最後の営業日を取得する

jpbizday.last_bizday() で指定月の 最後の 営業日を取得することが出来ます。

> jpbizday.last_bizday(2020, 5)
datetime.date(2020, 5, 29)

「今月の、最後の営業日を取得したい」といった場合は以下のように実行出来ます。

> jpbizday.last_bizday(datetime.datetime.today())
datetime.date(2020, 2, 28)

指定月の最初の営業日なのかを判定する

jpbizday.is_first_bizday() で指定日が指定月の最初の営業日なのかを判定することが出来ます。

> jpbizday.is_first_bizday(datetime.date(2020, 1, 1))
False
> jpbizday.is_first_bizday(datetime.date(2020, 1, 6))
True

指定月の最後の営業日なのかを判定する

jpbizday.is_last_bizday() で指定日が指定月の最後の営業日なのかを判定することが出来ます。

> jpbizday.is_last_bizday(datetime.date(2020, 1, 31))
True
> jpbizday.is_last_bizday(datetime.date(2020, 1, 30))
False