7月と言えば海の日がありますが、祝日があるととスケジュール管理が面倒ですね。
eleganttは少ないコード量でガントチャートが描けるライブラリですが、ちょっとした工夫で祝日に考慮したガントチャートを生成することができます。この方法はeleganttに限らず、祝日を扱う一般的な方法だと思いますので、ぜひ参考にしてみてください。
まず、変更前のコードから。カレンダーがすぐ確認できるようGoogle Colab上でIpythonを使って表示させています。祝日を考慮していないので海の日が完了日になってますね。
import elegantt
from IPython.display import display
g = elegantt.EleGantt()
s = """
プロジェクトA: 2024-07-08,3d
プロジェクトA2: 3d
"""
g.auto_draw(s)
display(g.im)
これに対してholidaysという祝日を取得できるライブラリを使って、祝日対応させてみます。
まずholidaysで「JP」の祝日を設定し、pandasのdate_rangeとtolistで作った連続した日付のリストに対して祝日か否かを判定し、祝日の場合はmy_holidaysに加えます。
import holidays
import pandas as pd
jp_holiday = holidays.country_holidays('JP')
my_holidays = []
days = 10
date_list = pd.date_range(
start=pd.Timestamp("today").normalize(),
end=pd.Timestamp("today")+pd.Timedelta(days=days)
).tolist()
for date in date_list:
if date in jp_holiday:
print(date, jp_holiday.get(date))
my_holidays.append(date.strftime('%Y-%m-%d'))
else:
print(date)
print(my_holidays)
実行すると下記のように出力します。なお、これは7月6日に実行したからこうなりますが、祝日がない時期に実行する場合はpd.Timestamp("today")
という箇所をpd.Timestamp("2024-07-06")
に書き換えれば同じように出力されます。
2024-07-06 00:00:00
2024-07-07 00:00:00
2024-07-08 00:00:00
2024-07-09 00:00:00
2024-07-10 00:00:00
2024-07-11 00:00:00
2024-07-12 00:00:00
2024-07-13 00:00:00
2024-07-14 00:00:00
2024-07-15 00:00:00 Marine Day
2024-07-16 00:00:00
['2024-07-15']
サンプルなのでdays=10としましたが実際は365日ぐらい設定しておいた方がいいと思います。
こうして生成したmy_holidaysをeleganttのset_holidaysで指定すれば、祝日を考慮したガントチャートが手軽に生成できます。
g.set_holidays(my_holidays)
g.auto_draw(s)
display(g.im)
なお、会社の創立記念日などカレンダーに乗ってない祝日を設定したい場合はmy_holidaysに下記のように設定しておき、holidaysで判定した結果をappendすれば動作します。
my_holidays = ["2024-07-10"]
韓国語版はこちら。