Pandas Data Offsets: カスタムビジネス時間オフセットで月の最初のビジネスデーを判定する


カスタムビジネス時間オフセットとは、通常の平日(月曜日から金曜日)だけでなく、土曜日や日曜日を含む任意の曜日をビジネスデーとして定義できるオフセットです。また、営業時間の開始時間と終了時間も自由に設定できます。

is_month_start メソッドは、このようなカスタムビジネス時間オフセットに基づいて、指定された時刻がその月の最初のビジネスデーかどうかを判定します。

使用方法

import pandas as pd

# カスタムビジネス時間オフセットを作成
cbh = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00', weekmask='Mon Tue Wed Thu Fri Sat')

# 時刻を設定
timestamp = pd.Timestamp('2024-07-01 09:00:00')

# 判定
is_month_start = cbh.is_month_start(timestamp)

print(is_month_start)  # True

出力

True

上記の例では、cbh というカスタムビジネス時間オフセットを作成し、timestamp という時刻を指定しています。cbh は、月曜日から土曜日までの9時から18時までをビジネスデーとして定義しています。is_month_start メソッドを呼び出すことで、timestamp が7月1日の最初のビジネスデーであるかどうかを判定しています。結果は True となり、7月1日が最初のビジネスデーであることが確認できます。

  • このメソッドは、主にデータ分析や金融取引などの分野で、月初の処理を効率的に行うために使用されます。
  • is_month_start メソッドは、CustomBusinessHour オフセットだけでなく、他のオフセットクラス(例えば、BMonthOffset)でも使用できます。


import pandas as pd

# カスタムビジネス時間オフセットを作成
cbh = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00', weekmask='Mon Tue Wed Thu Fri Sat')

# 対象月を設定
target_month = 8

# 各月の最初のビジネスデーをリストに格納
first_business_days = []
for year in range(2022, 2025):
    for month in range(1, target_month + 1):
        timestamp = pd.Timestamp(f'{year}-{month}-01 09:00:00')
        if cbh.is_month_start(timestamp):
            first_business_days.append(timestamp)

print(first_business_days)

出力

[Timestamp('2022-08-01 09:00:00'), Timestamp('2023-08-01 09:00:00'), Timestamp('2024-08-01 09:00:00')]

このコードでは、2022年から2024年までの8月の最初のビジネスデーをリストに格納しています。

import pandas as pd

# カスタムビジネス時間オフセットを作成
cbh = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00', weekmask='Mon Tue Wed Thu Fri Sat')

# 対象月を設定
target_month = 8

# 各月の最初のビジネスデーとその前後の日をリストに格納
first_business_days = []
for year in range(2022, 2025):
    for month in range(1, target_month + 1):
        timestamp = pd.Timestamp(f'{year}-{month}-01 09:00:00')
        if cbh.is_month_start(timestamp):
            first_business_days.append((timestamp - cbh, timestamp, timestamp + cbh))

print(first_business_days)

出力

[((Timestamp('2022-07-29 09:00:00'), Timestamp('2022-08-01 09:00:00'), Timestamp('2022-08-02 09:00:00')),
 (Timestamp('2023-07-31 09:00:00'), Timestamp('2023-08-01 09:00:00'), Timestamp('2023-08-02 09:00:00')),
 (Timestamp('2024-07-30 09:00:00'), Timestamp('2024-08-01 09:00:00'), Timestamp('2024-08-02 09:00:00'))]

このコードでは、2022年から2024年までの8月の最初のビジネスデーとその前後の日をリストに格納しています。

import pandas as pd

# カスタムビジネス時間オフセットを作成
cbh = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00', weekmask='Mon Tue Wed Thu Fri Sat', holidays=['2023-08-15'])

# 対象月を設定
target_month = 8

# 各月の最初のビジネスデーをリストに格納
first_business_days = []
for year in range(2022, 2025):
    for month in range(1, target_month + 1):
        timestamp = pd.Timestamp(f'{year}-{month}-01 09:00:00')
        if cbh.is_month_start(timestamp):
            first_


代替方法

以下に、is_month_start メソッドの代替方法をいくつか紹介します。

day_of_week と is_valid メソッドの組み合わせ

import pandas as pd

# カスタムビジネス時間オフセットを作成
cbh = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00', weekmask='Mon Tue Wed Thu Fri Sat')

# 時刻を設定
timestamp = pd.Timestamp('2024-07-01 09:00:00')

# 曜日を取得
day_of_week = timestamp.day_of_week

# 有効なビジネスデーかどうか判定
is_valid_business_day = cbh.is_valid(timestamp)

# 月の最初のビジネスデーかどうか判定
is_month_start = (day_of_week == 0) and is_valid_business_day

print(is_month_start)  # True

CustomBusinessDay オブジェクトの is_valid メソッド

import pandas as pd

# カスタムビジネスデーを作成
custom_business_day = pd.tseries.offsets.CustomBusinessDay(start='09:00', end='18:00', weekmask='Mon Tue Wed Thu Fri Sat')

# 時刻を設定
timestamp = pd.Timestamp('2024-07-01 09:00:00')

# 月の最初のビジネスデーかどうか判定
is_month_start = (timestamp == custom_business_day.offsets.create(timestamp))

print(is_month_start)  # True

ループによる判定

import pandas as pd

# カスタムビジネス時間オフセットを作成
cbh = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00', weekmask='Mon Tue Wed Thu Fri Sat')

# 時刻を設定
timestamp = pd.Timestamp('2024-07-01 09:00:00')

# 月の最初のビジネスデーかどうか判定
is_month_start = True
while timestamp.day_of_week != 0:
    timestamp -= cbh

print(is_month_start)  # True

外部ライブラリの利用

dateutilPytz などの外部ライブラリを使用して、月の最初のビジネスデーを判定することもできます。

カスタム関数

選択のポイント

どの代替方法を選択するかは、処理対象のデータ量、処理速度、コードの簡潔性などを考慮して決定する必要があります。