Pandasで四半期末分析を効率化!CustomBusinessHourとis_quarter_startで時短テクニックを公開


pandas.tseries.offsets.CustomBusinessHour.is_quarter_start は、指定された時刻が四半期の最初の営業日かどうかを判断する関数です。

引数

  • ts_timestamp: 時刻を表す Timestamp オブジェクト

戻り値

  • 時刻が四半期の最初の営業日ではない場合: False
  • 時刻が四半期の最初の営業日の場合: True

詳細

CustomBusinessHour オフセットは、カスタムの営業時間に基づいて日付をオフセットするために使用されます。このオフセットは、週マスク、祝日、カレンダーをカスタマイズすることができます。

is_quarter_start メソッドは、CustomBusinessHour オフセットを使用して、四半期の最初の営業日かどうかを判断します。このメソッドは、四半期の開始日を計算するために使用することができます。

import pandas as pd

# 営業時間を定義する
start_time = "09:00:00"
end_time = "17:00:00"
weekmask = "Mon Tue Wed Thu Fri"
holidays = ["2023-12-25", "2024-01-01"]

# カスタムビジネスアワーオフセットを作成する
offset = pd.offsets.CustomBusinessHour(start=start_time, end=end_time, weekmask=weekmask, holidays=holidays)

# 時刻を定義する
timestamp = pd.Timestamp("2024-01-02 09:00:00")

# 時刻が四半期の最初の営業日かどうかを確認する
is_quarter_start = offset.is_quarter_start(timestamp)

print(is_quarter_start)  # True

上記の例では、2024-01-02 09:00:00 は2024年第1四半期の最初の営業日であるため、is_quarter_startTrue を返します。

  • is_quarter_start メソッドは、CustomBusinessHour オフセットのみで使用できます。
  • is_quarter_start メソッドは、四半期の定義に依存します。デフォルトでは、四半期は1月から3月、4月から6月、7月から9月、10月から12月と定義されます。


四半期の最初の営業日のリストを取得する

import pandas as pd

# 営業時間を定義する
start_time = "09:00:00"
end_time = "17:00:00"
weekmask = "Mon Tue Wed Thu Fri"
holidays = ["2023-12-25", "2024-01-01"]

# カスタムビジネスアワーオフセットを作成する
offset = pd.offsets.CustomBusinessHour(start=start_time, end=end_time, weekmask=weekmask, holidays=holidays)

# 開始日と終了日を定義する
start_date = pd.Timestamp("2023-01-01")
end_date = pd.Timestamp("2024-12-31")

# 各四半期の最初の営業日のリストを作成する
quarter_start_dates = []
for quarter in range(1, 5):
    quarter_start_date = start_date + (quarter - 1) * pd.offsets.QuarterEnd(offset=offset)
    quarter_start_dates.append(quarter_start_date)

# 結果を表示する
print(quarter_start_dates)

特定の日付が四半期の最初の営業日かどうかを確認する

import pandas as pd

# 営業時間を定義する
start_time = "09:00:00"
end_time = "17:00:00"
weekmask = "Mon Tue Wed Thu Fri"
holidays = ["2023-12-25", "2024-01-01"]

# カスタムビジネスアワーオフセットを作成する
offset = pd.offsets.CustomBusinessHour(start=start_time, end=end_time, weekmask=weekmask, holidays=holidays)

# 時刻を定義する
timestamp = pd.Timestamp("2024-04-02 09:00:00")

# 時刻が四半期の最初の営業日かどうかを確認する
is_quarter_start = offset.is_quarter_start(timestamp)

print(is_quarter_start)  # True

このコードは、2024-04-02 09:00:00 が2024年第2四半期の最初の営業日かどうかを確認します。

import pandas as pd

# 営業時間を定義する
start_time = "09:00:00"
end_time = "17:00:00"
weekmask = "Mon Tue Wed Thu Fri"
holidays = ["2023-12-25", "2024-01-01"]

# カスタムビジネスアワーオフセットを作成する
offset = pd.offsets.CustomBusinessHour(start=start_time, end=end_time, weekmask=weekmask, holidays=holidays)

# 開始日と終了日を定義する
start_date = pd.Timestamp("2023-01-01")
end_date = pd.Timestamp("2024-12-31")

# 各四半期の最初の営業日でループする
for quarter_start_date in pd.date_range(start=start_date, end=end_date, freq=offset + pd.offsets.QuarterEnd()):
    print(quarter_start_date)

このコードは、2023年1月から2024年12月までの各四半期の最初の営業日をループします。



pd.offsets.QuarterEnd オフセットと is_offset_on_same_day メソッドを使用する

import pandas as pd

# 営業時間を定義する
start_time = "09:00:00"
end_time = "17:00:00"
weekmask = "Mon Tue Wed Thu Fri"
holidays = ["2023-12-25", "2024-01-01"]

# カスタムビジネスアワーオフセットを作成する
offset = pd.offsets.CustomBusinessHour(start=start_time, end=end_time, weekmask=weekmask, holidays=holidays)

# 時刻を定義する
timestamp = pd.Timestamp("2024-04-02 09:00:00")

# 四半期の終了オフセットを作成する
quarter_end_offset = pd.offsets.QuarterEnd(offset=offset)

# 時刻が四半期の終了日と同じ日かどうかを確認する
is_quarter_end = quarter_end_offset.is_on_offset(timestamp)

# 時刻が四半期の最初の営業日かどうかを確認する
if is_quarter_end and offset.is_business_day(timestamp):
    is_quarter_start = True
else:
    is_quarter_start = False

print(is_quarter_start)  # True

この方法は、CustomBusinessHour オフセットと is_quarter_start メソッドを使用するよりもシンプルで、読みやすいコードとなります。

pytz ライブラリと is_first_day_of_month メソッドを使用する

import pandas as pd
import pytz

# 営業時間を定義する
start_time = "09:00:00"
end_time = "17:00:00"
weekmask = "Mon Tue Wed Thu Fri"
holidays = ["2023-12-25", "2024-01-01"]

# カスタムビジネスアワーオフセットを作成する
offset = pd.offsets.CustomBusinessHour(start=start_time, end=end_time, weekmask=weekmask, holidays=holidays)

# 時刻を定義する
timestamp = pd.Timestamp("2024-04-02 09:00:00")

# タイムゾーンを設定する
timezone = pytz.timezone("America/Los_Angeles")

# 時刻をタイムゾーンに変換する
tz_timestamp = timestamp.tz_localize(timezone)

# 月の最初の営業日かどうかを確認する
is_first_business_day_of_month = offset.is_business_day(tz_timestamp) and tz_timestamp.day == 1

# 時刻が四半期の最初の営業日かどうかを確認する
if is_first_business_day_of_month and (tz_timestamp.month % 3) == 1:
    is_quarter_start = True
else:
    is_quarter_start = False

print(is_quarter_start)  # True

この方法は、pytz ライブラリを使用してタイムゾーンを考慮することができます。

import pandas as pd

# 営業時間を定義する
start_time = "09:00:00"
end_time = "17:00:00"
weekmask = "Mon Tue Wed Thu Fri"
holidays = ["2023-12-25", "2024-01-01"]

# カスタムビジネスアワーオフセットを作成する
offset = pd.offsets.CustomBusinessHour(start=start_time, end=end_time, weekmask=weekmask, holidays=holidays)

# 時刻を定義する
timestamp = pd.Timestamp("2024-04-02 09:00:00")

# 時刻が四半期の最初の営業日かどうかを確認する
def is_quarter_start(timestamp, offset=offset):
    # 四半期の開始月を取得する
    quarter_start_month = (timestamp.month - 1) // 3 + 1

    # 時刻が