時系列データを扱っていると曜日は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 ...