Pythonの祝日データライブラリに即位関係の祝日を追加してPRを出した話

エレファンテックの野村浩気です。社内ではソフトウェア開発やマーケティングを担当しています。
Pythonのライブラリに天皇即位に関する祝日を追加するプルリクエスト(PR)を送るという人生に一度しか無さそうな経験をしたので、せっかくの機会ということでブログを書きました。

TL; DR(長い文を読みたくない人向けのまとめ)

  • 営業日を計算するPythonのライブラリにbdateutil、それと一緒に使う祝日データのライブラリにholidaysというものがある
  • holidaysの日本の祝日データは全然更新されない!
  • 自分で日本の祝日データ追加してPR出してマージしてもらった

背景

エレファンテックのウェブサイト・社内システムでは祝日のデータにholidays、営業日の計算にbdateutilというライブラリを利用している。

例えば2019年5月8日に出荷したい製品の製造に3営業日かかるとして何日から製造し始めれば良いんだろう、という計算をする必要があるため。(ちなみに正解は4/25。4/27〜5/6が休み、5/7はエレファンテックの製造休なので、4/25, 4/26, 5/8 で3営業日となる。実際はもうちょっと余裕を持って作り始めているけど。)

このholidaysというライブラリ、全く日本の祝日データが更新されないので2019年の天皇即位に関わる祝日・休日も追加されていなかった。

holidays, bdateutilについて

holidaysはこんな感じで特定の日が祝日・休日かどうかをブール型で返してくれるライブラリ。
>>> from bdateutil import date
>>> import holidays
>>> jp_holidays = holidays.Japan()
>>> date(2019, 4, 26) in jp_holidays
False
>>> date(2019, 5, 1) in jp_holidays  # 天皇即位の日
True

bdateutilと組み合わせることで日本の祝休日やエレファンテックの休業日などカスタムの休日を反映した営業日計算をすることができる。
>>> from bdateutil import relativedelta
# (略)
# Elephantech というエレファンテックの製造休を示すクラスを定義

# 2019/4/25の3営業日後は?(日本の祝休日とエレファンテックの製造休も考慮する)
>>> date(2019, 4, 25) + relativedelta(bdays=+3, holidays=holidays.Japan()+Elephantech()
bdateutil.date(2019, 5, 8)

祝休日のデータを持っているライブラリは世の中には色々あるし、内閣府からも祝休日のCSVが公開されているが、bdateutilの標準でholidaysが利用されていて、またエレファンテックの製造休を別に定義できるカスタマイズ性が良かったのでholidaysを選んだ。
とは言え現在では他にもっと良いライブラリや方法があるかもしれないので知っている人がいたらコメント等で教えてもらえると嬉しいです。

天皇即位に関する祝日を調べる

このholidays、自分たち以外に使ってる日本人が一人もいないんじゃないかと思うくらいに全く日本の祝日が更新されない。

というかそもそも最初に日本の祝日を追加したのも僕で、bdateutil/holidaysの組み合わせ便利そうだな〜と思って使ったら日本の祝日が定義されてなく、他のライブラリを検討したものの結局これが一番便利そうだったので仕方なく自分で追加したという事情がある。

ちなみに祝日と祝日に挟まれた平日は国民の休日になるが、この種類の休日と振替休日は真面目にコードを書くほうが大変そうだったのでハードコードした。特に変更が無い限りは2099年までは使えるはず。

ところが今回天皇が即位し、それに伴う祝休日の変更があったということで、まずは一次情報に当たるために内閣府のページを確認。ゴールデンウィークだけでなく10/22も即位礼正殿の儀が行われる日ということで祝日になることを知った。

これで終わりと思ったが念のためにWikipediaを確認していたところ、天皇誕生日も変更になることに気づく。そして2019年は天皇誕生日が無いことを知った(令和の天皇の誕生日が2/23のため)。

PRを出した

これらを実装してテストを書いてプルリクエストを出した。返ってきた返事は

「なぜこの祝日は2019年だけに限定されてるんだい?」との旨を大変丁寧に告げられる。天皇の即位なんだから2019年だけに決まってるじゃんという思いをこちらも丁寧に返し、


"no problem at all" とのことで無事マージされました。めでたし。(moreover...と書かれていることは誤解なんだけれど、頑張って説明して日本の祝休日を理解してもらう必要も無いと思ったので説明しなかった)

ちなみにこのメンテナーさんは以前のメンテナーと変わっていて、レスポンスがとても早いので助かった。このスピードでレスポンスしてしかも丁寧な文章というのは今まで何度かPRを出して初めて出会った気がする。すごい。

おまけ

Pythonのライブラリで日本の祝日を更新していてbdateutilのように営業日計算にも使えるライブラリがあったら本当に知りたいので誰か教えてください。
無いならみんなbdateutil/holidaysを使って、時々日本の祝日情報を更新してください。

コメント

  1. Rb88 | Football Prediction Site - thtopbet.com
    Welcome 카지노사이트 to thobet,the best football prediction rb88 site offering in the world. The most accurate 더킹카지노 and most comprehensive online soccer prediction site

    返信削除
  2. The Casino Hotel & Casino - Mapyro
    Get directions, reviews and information for The 속초 출장마사지 Casino Hotel & 평택 출장샵 Casino 안산 출장안마 in Hanover, IN. Casino 충주 출장마사지 Name, Casino Name, Address, Casino Size, 포항 출장마사지 Height,

    返信削除
  3. Stainless Steel - Titanium Tits - Titanium Straightener
    Stainless Steel titanium rod in leg titanium metal Stainless Steel. Stainless Steel Stainless aluminum vs titanium Steel 2,400 titanium bars 1,900. head titanium ti s6

    返信削除
  4. "The first being time, the second being more creativity, the third being value, fourth being materials." The manufacturing stakeholders concerned in choices around 3D printing count on vital growth. Ninety-seven p.c of producers polled count on their use of 3D printing precision machining to grow within the subsequent 5 years. Pete Basiliere shares insights on how 3D printing reduces logistical prices and shortens supply occasions. Positioning-centric data is changing finest way|the means in which} folks, businesses and governments work throughout the world.

    返信削除

コメントを投稿