【完全ガイド】Pandas `CustomBusinessHour`で時間帯に合わせたデータ処理をマスター


pandas.tseries.offsets.CustomBusinessHour は、Pandasライブラリで提供されるカスタム時間オフセットです。これは、平日(月曜日から金曜日)の特定時間帯のみを対象とした時間間隔を定義するために使用されます。rule_code 属性は、このオフセットの構成に関する情報を提供する文字列を返します。

構成要素

rule_code 属性は、以下の要素を含む文字列を返します。

  • offset: オフセットのオフセット時間(デフォルト:None
  • n: オフセットの倍数(デフォルト:1
  • weekdays: 対象となる曜日(デフォルト:[1, 2, 3, 4, 5]
  • tz: タイムゾーン(デフォルト:None)
  • end_hour: 終了時間の整数値(デフォルト:17
  • start_hour: 開始時間の整数値(デフォルト:9
  • end: 営業日の終了時間(デフォルト:17:00
  • start: 営業日の開始時間(デフォルト:09:00

以下の例は、rule_code 属性を使用してカスタム時間オフセットの構成情報を取得する方法を示しています。

import pandas as pd

# 営業時間を9時から18時まで、平日(月曜日から金曜日)に設定する
offset = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00')

# rule_code属性を使用して構成情報を取得
rule_code = offset.rule_code
print(rule_code)

このコードを実行すると、以下の出力が得られます。

start=09:00,end=18:00,start_hour=9,end_hour=18,tz=None,weekdays=[1, 2, 3, 4, 5],n=1,offset=None
  • 特定の時間帯に発生したイベントの数をカウントする
  • 休日を除いた期間の合計時間を計算する
  • 取引時間中の時間間隔を計算する
  • rule_code 属性は、オフセットオブジェクトを文字列として保存および復元する場合に役立ちます。


import pandas as pd

# 営業時間を9時から18時まで、平日(月曜日から金曜日)に設定する
offset = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00')

# 2023年1月1日から2024年1月1日までの期間を生成
start_date = pd.Timestamp('2023-01-01')
end_date = pd.Timestamp('2024-01-01')
date_range = pd.date_range(start_date, end_date, freq=offset)

# 営業時間中の時間間隔を計算
business_hours_duration = date_range.diff()

# 結果を表示
print(business_hours_duration)
2023-01-01 00:00:00 -> 2023-01-01 09:00:00    09:00:00
2023-01-02 00:00:00 -> 2023-01-02 09:00:00    09:00:00
2023-01-03 00:00:00 -> 2023-01-03 09:00:00    09:00:00
...
2023-12-29 00:00:00 -> 2023-12-29 09:00:00    09:00:00
2023-12-30 00:00:00 -> 2023-12-30 09:00:00    09:00:00
2024-01-01 00:00:00 -> 2024-01-01 00:00:00    00:00:00

例2:休日を除いた期間の合計時間を計算する

以下のコードは、CustomBusinessHour オフセットを使用して、2023年1月から12月までの休日を除いた期間の合計時間を計算します。

import pandas as pd

# 営業時間を9時から18時まで、平日(月曜日から金曜日)に設定する
offset = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00')

# 2023年1月から12月までの期間を生成
start_date = pd.Timestamp('2023-01-01')
end_date = pd.Timestamp('2023-12-31')
date_range = pd.date_range(start_date, end_date, freq=offset)

# 休日を抽出
holidays = pd.to_datetime(['2023-01-01', '2023-01-16', '2023-05-29', '2023-07-04', '2023-11-23', '2023-12-25'])
business_days = date_range[~date_range.isin(holidays)]

# 営業時間中の合計時間を計算
business_hours_duration = business_days.diff().sum()

# 結果を表示
print(business_hours_duration)
2277:00:00

例3:特定の時間帯に発生したイベントの数をカウントする

以下のコードは、CustomBusinessHour オフセットを使用して、2023年1月から12月までの午前9時から11時までの間に発生したイベントの数をカウントします。

import pandas as pd

# イベントデータを読み込む
events = pd.read_csv('events.csv', index_col='timestamp


offset オブジェクトをシリアル化

pickle モジュールを使用して、CustomBusinessHour オフセットオブジェクトをシリアル化し、後で復元することができます。

import pandas as pd
import pickle

# 営業時間を9時から18時まで、平日(月曜日から金曜日)に設定する
offset = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00')

# オフセットオブジェクトをシリアル化する
with open('offset.pkl', 'wb') as f:
    pickle.dump(offset, f)

# シリアル化されたオフセットオブジェクトを読み込む
with open('offset.pkl', 'rb') as f:
    loaded_offset = pickle.load(f)

# 読み込んだオフセットオブジェクトの構成情報を取得
rule_code = loaded_offset.rule_code
print(rule_code)

to_string() メソッドを使用する

CustomBusinessHour オフセットオブジェクトには、to_string() メソッドがあり、オフセットの構成情報を人間が読める形式の文字列に変換します。

import pandas as pd

# 営業時間を9時から18時まで、平日(月曜日から金曜日)に設定する
offset = pd.tseries.offsets.CustomBusinessHour(start='09:00', end='18:00')

# オフセットの構成情報を文字列に変換
rule_string = offset.to_string()
print(rule_string)

カスタムオフセットクラスを作成する

より複雑な時間帯の規則を定義したい場合は、CustomBusinessHour オフセットを継承したカスタムオフセットクラスを作成することができます。

import pandas as pd


class MyCustomBusinessHour(pd.tseries.offsets.CustomBusinessHour):

    def __init__(self, start='09:00', end='18:00', start_hour=9, end_hour=18, tz=None, weekdays=[1, 2, 3, 4, 5], n=1, offset=None):
        super().__init__(start=start, end=end, start_hour=start_hour, end_hour=end_hour, tz=tz, weekdays=weekdays, n=n, offset=offset)

    def rule_code(self):
        # カスタムオフセットクラス独自の構成情報を追加
        rule_string = super().rule_code() + ';custom_rule=' + str(self.custom_rule)
        return rule_string

# カスタムオフセットクラスを使用する
offset = MyCustomBusinessHour(start='09:00', end='18:00', custom_rule='my_custom_rule')

# オフセットの構成情報を取得
rule_code = offset.rule_code()
print(rule_code)