Pythonで日本の祝日と営業日カラムをつくりたい(ついでに中国も)

時系列データを扱っていると曜日はPandasが自前でなんとかしてくれるのですが、祝日などは追加したいことがあります。

そんな時はクローリングやエクセルで作ってもいいのですが、ひとまず以下のパッケージから取得できるようです - 日本祝日:jpholiday - 日本営業日:jpbizday - 中国祝日: chinese_holiday

使い方

基本は大枠を付けられて、会社などに応じて追加できればいいので、その方法です。 また、jpbizday`には月の初めの営業日などのメソッドもあるようですが、pandas上で作ればいいので、今回は記録しませんでした。

jpholiday

import jpholiday

#名前を返してくれる
#なければNone
jpholiday.is_holiday_name(datetime_obj)

#クラスをつくって拡張可能
#これだけ
import datetime
class TestHoliday(jpholiday.OriginalHoliday):
    def _is_holiday(self, date):
        if date == datetime.date(2020, 2, 9):
            return True
        return False

    def _is_holiday_name(self, date):
        return '特別休暇'

chinese_holiday

import chinese_holiday

#文字列で渡す
chinese_holiday.is_holiday('2020-01-01')
#true or false

#2021年の日付を渡すとエラー 

jpbizday

import jpbizday

jpbizday.is_bizday(datetime_obj)
#true or false

pandasと使ってみる

というわけでpandasと使ってみます。
基本はapplyから使うだけ、chinese_holidayのみ、テキストで渡さなければいかないのでそこだけ注意です。

import pandas

#date_rangeで日付生成
#テキストでもってるならto_datetimeを
dts = pd.Series(pd.date_range(start='2020-01-01',end='2020-12-31'))

#祝日(日本)
japan_hol = dts.apply(jpholiday.is_holiday_name)

#営業日(日本)
japan_biz = df['dt'].apply(jpbizday.is_bizday)

#祝日(中国)
china_hol = dts.apply(lambda x : chinese_holiday.is_holiday(x.strftime('%Y-%m-%d')))


df = pd.DataFrame(
    {
      'hol':dts.apply(jpholiday.is_holiday_name),
      'dt':dts.values
    }
)

df[df['hol'].notna()]

問題なさそうです。

hol  dt
0   元日  2020-01-01
12  成人の日    2020-01-13
41  建国記念の日  2020-02-11
53  天皇誕生日 2020-02-23
54  天皇誕生日 振替休日    2020-02-24
79  春分の日    2020-03-20
119 昭和の日    2020-04-29
123 憲法記念日 2020-05-03
...