【保存版】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 は、dateoffset で定義されるカスタムビジネスデイであり、かつその年の最初のビジネスデイであるかどうかを示すブール値です。
  • 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

これらの代替方法を状況に応じて使い分けることで、より効率的かつ柔軟なコードを書くことができます。

  • 複雑な判定処理が必要な場合は、パフォーマンスやコードの可読性を考慮して最適な方法を選択することが重要です。