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


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 であり、これはビジネス時間内であるためです。

引数

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

戻り値

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

  • 特定の曜日のみビジネス時間と設定する
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.SeriesDataFrame のインデックスに BusinessHour オブジェクトを設定することで、ビジネス時間に基づいたデータ分析を行うことができます。
  • pandas.tseries.offsets.BusinessHour オブジェクトは、timedelta オブジェクトと同様に、時刻の加算や減算に使用できます。


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

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)

解説

このコードは、dt が休憩時間外であればビジネス時間内であるかどうかを判定します。

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

実行結果

False

dt は休憩時間中なので、ビジネス時間外と判定されます。

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

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日なので、休暇と判定されます。

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


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)

解説

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