【保存版】PandasのCustomBusinessDayで年始判定!is_year_startの使い方とサンプルコード集
pandas.tseries.offsets.CustomBusinessDay.is_year_start
は、指定された日付が カスタムビジネスデイ であり、かつ その年の最初のビジネスデイ であるかどうかを確認する関数です。
使い方
import pandas as pd
# カスタムビジネスデイオフセットを作成
offset = pd.offsets.CustomBusinessDay(weekmask='Mon Tue Wed Thu Fri')
# 特定の日付
date = pd.Timestamp('2024-01-01')
# その日付がカスタムビジネスデイかつ年始かどうかを確認
is_year_start = offset.is_year_start(date)
print(is_year_start) # True
is_year_start
は、date
がoffset
で定義されるカスタムビジネスデイであり、かつその年の最初のビジネスデイであるかどうかを示すブール値です。date
は、判定対象となる日付を表すオブジェクトです。offset
は、カスタムビジネスデイオフセットを表すオブジェクトです。上記の場合、月曜日から金曜日のみビジネスデイとなります。
is_year_start
は、データ分析において、年初の数値を特定したり、年ごとの集計処理を行う際に役立ちます。CustomBusinessDay
オフセットは、休日や特定の日付を祝日として扱えるなど、柔軟なビジネスデイのカスタマイズが可能です。
特定の年における最初のカスタムビジネスデイを取得
import pandas as pd
# カスタムビジネスデイオフセットを作成
offset = pd.offsets.CustomBusinessDay(weekmask='Mon Tue Wed Thu Fri')
# 特定の年
year = 2024
# その年の最初のカスタムビジネスデイを取得
first_biz_day = offset.on_offset(pd.Timestamp(year, 1, 1))
print(first_biz_day) # 2024-01-02
- 1月1日は日曜日であるため、最初のカスタムビジネスデイは1月2日となります。
on_offset
メソッドは、指定された日付をオフセットに基づいて調整します。- 上記コードでは、2024年における最初のカスタムビジネスデイを取得しています。
特定の年におけるすべてのカスタムビジネスデイをリスト化
import pandas as pd
# カスタムビジネスデイオフセットを作成
offset = pd.offsets.CustomBusinessDay(weekmask='Mon Tue Wed Thu Fri')
# 特定の年
year = 2024
# その年のすべてのカスタムビジネスデイをリスト化
biz_days = []
date = pd.Timestamp(year, 1, 1)
while offset.is_year_end(date) is False:
biz_days.append(date)
date += offset
print(biz_days)
解説
- それぞれのループで、
biz_days
リストにdate
を追加し、date
をオフセット分だけ進めます。 while
ループは、date
がその年の最後のビジネスデイになるまで繰り返されます。is_year_end
メソッドは、指定された日付がオフセットに基づいてその年の最後のビジネスデイかどうかを確認します。- 上記コードでは、2024年におけるすべてのカスタムビジネスデイをリスト化しています。
import pandas as pd
# カスタムビジネスデイオフセットを作成
offset = pd.offsets.CustomBusinessDay(weekmask='Mon Tue Wed Thu Fri')
# 特定の年
year = 2024
# 月ごとのカスタムビジネスデイ数を集計
biz_day_counts = []
for month in range(1, 13):
start_date = pd.Timestamp(year, month, 1)
end_date = start_date + pd.offsets.MonthEnd()
biz_day_counts.append((start_date.strftime('%Y-%m'), len(pd.date_range(start_date, end_date, freq=offset))))
print(biz_day_counts) # [('2024-01', 22), ('2024-02', 20), ('2024-03', 22), ('2024-04', 22), ('2024-05', 21), ('2024-06', 20), ('2024-07', 22), ('2024-08', 22), ('2024-09', 21), ('2024-10', 22), ('2024-11', 20), ('2024-12', 22)]
len
関数は、リストの長さを取得し、その月のカスタムビジネスデイ数を表します。pd.date_range
関数は、指定された期間におけるすべてのカスタムビジネスデイを含む日付の範囲を生成します。for
ループは、1月から12月までの各月に対して処理を行います。- 上記コードでは、2024年における月ごとのカスタムビジネスデイ数を集計しています。
特定の条件で判定する
- 欠点:複雑なロジックが必要になる場合があり、コードが冗長になる可能性があります。
- 利点:最も柔軟な方法で、様々な条件を設定できます。
import pandas as pd
# カスタムビジネスデイオフセットを作成
offset = pd.offsets.CustomBusinessDay(weekmask='Mon Tue Wed Thu Fri')
# 特定の日付
date = pd.Timestamp('2024-01-01')
# 年始かどうか判定
is_year_start = (date.is_business_day(offset)
and date.month == 1
and date.day == 1)
print(is_year_start) # True
pd.Timestamp.is_year_start を利用する
- 欠点:カスタムビジネスデイかどうかを判定できないため、注意が必要です。
- 利点:シンプルで分かりやすいコードで書けます。
import pandas as pd
# 特定の日付
date = pd.Timestamp('2024-01-01')
# 年始かどうか判定
is_year_start = date.is_year_start
print(is_year_start) # True
特定の条件でフィルタリングする
- 欠点:個別の判定には向いていません。
- 利点:データフレーム全体に対して効率的に処理できます。
import pandas as pd
# データフレームを作成
df = pd.DataFrame({'date': ['2023-12-31', '2024-01-01', '2024-01-02', '2024-01-03']})
# カスタムビジネスデイオフセットを作成
offset = pd.offsets.CustomBusinessDay(weekmask='Mon Tue Wed Thu Fri')
# 年始の行を抽出
year_start_df = df[df['date'].dt.is_business_day(offset) & (df['date'].dt.month == 1) & (df['date'].dt.day == 1)]
print(year_start_df)
外部ライブラリを利用する
- 欠点:追加のライブラリをインストールする必要があり、コードの可読性が低下する可能性があります。
- 利点:複雑な判定処理を簡単に実行できます。
import pandas as pd
from dateutil.relativedelta import relativedelta
# 特定の日付
date = pd.Timestamp('2024-01-01')
# カスタムビジネスデイオフセットを作成
offset = pd.offsets.CustomBusinessDay(weekmask='Mon Tue Wed Thu Fri')
# 年始かどうか判定
is_year_start = (date.is_business_day(offset)
and date.month == 1
and date.day == 1)
# または、dateutil.relativedelta モジュールを利用
is_year_start = (date + relativedelta(months=+1, day=1)).day == 1
print(is_year_start) # True
これらの代替方法を状況に応じて使い分けることで、より効率的かつ柔軟なコードを書くことができます。
- 複雑な判定処理が必要な場合は、パフォーマンスやコードの可読性を考慮して最適な方法を選択することが重要です。