【超便利】pandasでビジネス時間判定!is_on_offsetの使い方とサンプルコード

2024-07-04

pandas.tseries.offsets.BusinessHour.is_on_offset は、指定された時刻がビジネス時間の範囲内に含まれているかどうかを判定する関数です。

使い方

import pandas as pd

# 時刻を指定
dt = pd.Timestamp('2024-07-03 10:30:00')

# ビジネス時間のオブジェクトを生成
offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17)

# 時刻がビジネス時間内かどうか判定
is_on_offset = offset.is_on_offset(dt)

# 結果を出力
print(is_on_offset)

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

True

これは、dt2024-07-03 10:30:00 であり、これはビジネス時間内であるためです。

引数

  • dt: 判定対象の時刻
  • start: ビジネス時間開始時刻 (デフォルト: 9)
  • end: ビジネス時間終了時刻 (デフォルト: 17)
  • start_hour: ビジネス時間開始時間 (デフォルト: 9)
  • end_hour: ビジネス時間終了時間 (デフォルト: 17)

戻り値

  • True: 時刻がビジネス時間内
  • False: 時刻がビジネス時間外

  • 特定の曜日のみビジネス時間と設定する
offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17, week=pd.tseries.offsets.Week(days=[1, 2, 3, 4, 5]))

is_on_offset = offset.is_on_offset(dt)

print(is_on_offset)
  • 休憩時間を設定する
offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17, lunch_break=(12, 13))

is_on_offset = offset.is_on_offset(dt)

print(is_on_offset)
  • 特定の時刻を休暇として設定する
offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17, holidays=['2024-07-04'])

is_on_offset = offset.is_on_offset(dt)

print(is_on_offset)

注意点

  • タイムゾーンは考慮されません。
  • 土曜日と日曜日はデフォルトでビジネス時間外です。
  • 休暇や休憩時間はオプションで設定できます。
  • pandas.tseries.offsets.BusinessHour オブジェクトは、timedelta オブジェクトと同様に、時刻の加算や減算に使用できます。
  • pandas.SeriesDataFrame のインデックスに BusinessHour オブジェクトを設定することで、ビジネス時間に基づいたデータ分析を行うことができます。


    特定の曜日のみビジネス時間と設定

    import pandas as pd
    
    # 時刻を指定
    dt = pd.Timestamp('2024-07-03 10:30:00')
    
    # 特定の曜日のみビジネス時間と設定
    offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17, week=pd.tseries.offsets.Week(days=[1, 2, 3, 4, 5]))
    
    # 時刻がビジネス時間内かどうか判定
    is_on_offset = offset.is_on_offset(dt)
    
    # 結果を出力
    print(is_on_offset)
    

    このコードは、dt が指定された曜日であればビジネス時間内であるかどうかを判定します。

    • week=pd.tseries.offsets.Week(days=[1, 2, 3, 4, 5]) は、月曜日から金曜日までの曜日をビジネス時間と設定しています。

    実行結果

    True
    

    dt は水曜日なので、ビジネス時間内と判定されます。

    休憩時間を設定

    import pandas as pd
    
    # 時刻を指定
    dt = pd.Timestamp('2024-07-03 12:30:00')
    
    # 休憩時間を設定
    offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17, lunch_break=(12, 13))
    
    # 時刻がビジネス時間内かどうか判定
    is_on_offset = offset.is_on_offset(dt)
    
    # 結果を出力
    print(is_on_offset)
    

    解説

    • lunch_break=(12, 13) は、12時から13時までを休憩時間と設定しています。
    False
    

    特定の時刻を休暇として設定

    import pandas as pd
    
    # 時刻を指定
    dt = pd.Timestamp('2024-07-04 10:30:00')
    
    # 特定の時刻を休暇として設定
    offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17, holidays=['2024-07-04'])
    
    # 時刻がビジネス時間内かどうか判定
    is_on_offset = offset.is_on_offset(dt)
    
    # 結果を出力
    print(is_on_offset)
    
    • holidays=['2024-07-04'] は、2024年7月4日を休暇と設定しています。
    False
    

    dt は7月4日なので、休暇と判定されます。

    BusinessHour オブジェクトの加算・減算

    import pandas as pd
    
    # 時刻を指定
    dt = pd.Timestamp('2024-07-03 10:30:00')
    
    # ビジネス時間のオブジェクトを生成
    offset = pd.tseries.offsets.BusinessHour(start=9, end=17, start_hour=9, end_hour=17)
    
    # 2時間加算
    dt_plus_2_hours = dt + offset * 2
    
    # 3時間減算
    dt_minus_3_hours = dt - offset * 3
    
    # 結果を出力
    print(dt_plus_2_hours)
    print(dt_minus_3_hours)
    

    このコードは、BusinessHour オブジェクトを使って時刻に加算・減算を行います。

    • dt + offset * 2 は、dtBusinessHour オブジェクトを2回加算した時刻を取得します。
    • dt - offset * 3 は、dt から BusinessHour オブジェクトを3回減算した時刻を取得します。
    202
    


    pandas.tseries.offsets.BusinessHour.is_on_offset の代替方法

    以下は、代替方法として考えられる方法です。

    pd.DateOffset と is_valid を使用する

    import pandas as pd
    
    # 時刻を指定
    dt = pd.Timestamp('2024-07-03 10:30:00')
    
    # ビジネス時間のオブジェクトを生成
    offset = pd.DateOffset(hours=9, startday=1, endday=5)
    
    # 時刻がビジネス時間内かどうか判定
    is_on_offset = offset.is_valid(dt)
    
    # 結果を出力
    print(is_on_offset)
    

    解説

    • この方法は、pd.DateOffset オブジェクトと is_valid メソッドを使用して、時刻がビジネス時間かどうかを判定します。
    • pd.DateOffset オブジェクトは、hours 引数でビジネス時間の開始時間を設定できます。
    • is_valid メソッドは、時刻がオブジェクトのルールに合致しているかどうかを判定します。

    利点

    • BusinessHour オブジェクトよりもシンプルで分かりやすい。
    • 休憩時間や祝日などの設定が不要。

    欠点

    • 曜日によるビジネス時間の差を表現できない。

    カスタム関数を作成する

    import pandas as pd
    
    def is_business_hour(dt, start_hour=9, end_hour=17, week=[1, 2, 3, 4, 5], holidays=[]):
      """
      指定された時刻がビジネス時間かどうかを判定する関数
    
      Args:
        dt: 判定対象の時刻
        start_hour: ビジネス時間開始時間 (デフォルト: 9)
        end_hour: ビジネス時間終了時間 (デフォルト: 17)
        week: ビジネス曜日 (デフォルト: 月曜日から金曜日)
        holidays: 休暇 (デフォルト: なし)
    
      Returns:
        True: 時刻がビジネス時間内
        False: 時刻がビジネス時間外
      """
    
      if dt.weekday() not in week:
        return False
    
      if dt.hour < start_hour or dt.hour >= end_hour:
        return False
    
      if dt.date() in holidays:
        return False
    
      return True
    
    # 時刻を指定
    dt = pd.Timestamp('2024-07-03 10:30:00')
    
    # 時刻がビジネス時間内かどうか判定
    is_on_offset = is_business_hour(dt)
    
    # 結果を出力
    print(is_on_offset)
    
    • この方法は、カスタム関数を作成して、ビジネス時間かどうかを判定します。
    • 関数には、ビジネス時間の開始時間、終了時間、曜日、休暇などを引数として渡すことができます。
    • 関数の内部では、これらの情報を用いて、時刻がビジネス時間かどうかを判定します。
    • 曜日によるビジネス時間の差や、休憩時間、祝日などの設定を柔軟に行うことができる。
    • コードが複雑になる。

      これらのライブラリは、pandas.tseries.offsets.BusinessHour よりも柔軟な機能を提供しており、より複雑なビジネス時間のルールに対応することができます。

      pandas.tseries.offsets.BusinessHour.is_on_offset の代替方法は、状況に応じて選択する必要があります。

      • シンプルで分かりやすい方法: pd.DateOffsetis_valid を使用する
      • 曜日によるビジネス時間の差などを表現したい場合: カスタム関数を作成する