【超便利】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
これは、dt
が 2024-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.Series
やDataFrame
のインデックスに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
は、dt
にBusinessHour
オブジェクトを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.DateOffset
とis_valid
を使用する