【初心者向け】PandasでBusinessHourオフセットを扱う!normalizeメソッドの使い方と代替方法
pandas.tseries.offsets.BusinessHour.normalize
は、pandas
ライブラリにおける BusinessHour
オフセットを正規化するためのメソッドです。BusinessHour
オフセットは、ビジネス時間に基づいて日付をオフセットするものであり、通常は午前 9 時から午後 5 時までの時間帯を考慮します。
機能
normalize
メソッドは、以下の2つの機能を提供します。
- オフセットの正規化
normalize
メソッドは、オフセットの値を 1 に丸めます。これは、オフセットが常に 1 つのビジネス時間単位を表すようにするために行われます。 - 開始日と終了日の正規化
normalize
メソッドは、start
およびend
パラメータで指定された開始日と終了日を、最も近い真夜中に丸めます。これは、オフセットが常に真夜中から始まるようにするために行われます。
使用方法
normalize
メソッドは以下の構文で使用できます。
normalized_offset = offset.normalize()
ここで、offset
は正規化したい BusinessHour
オフセットです。
例
以下の例では、BusinessHour
オフセットを正規化し、その結果を出力します。
import pandas as pd
offset = pd.tseries.offsets.BusinessHour(start='10:00', end='16:00')
normalized_offset = offset.normalize()
print(normalized_offset)
このコードを実行すると、以下の出力が得られます。
BusinessDay(n=1)
これは、正規化されたオフセットが 1 つのビジネス時間単位を表すことを示しています。また、開始日と終了日がそれぞれ午前 0 時と午後 0 時に丸められていることも確認できます。
normalize
メソッドは、start
およびend
パラメータで指定された開始日と終了日が有効な日付であることを確認しません。無効な日付が指定された場合、予期しない結果が生じる可能性があります。normalize
メソッドは、オフセットの属性を変更しますが、元のオフセットオブジェクトは変更しません。オフセットオブジェクトを変更する場合は、offset = offset.normalize()
のように代入演算子を使用する必要があります。
import pandas as pd
offset = pd.tseries.offsets.BusinessHour(start='10:00', end='16:00', n=2)
normalized_offset = offset.normalize()
print(normalized_offset)
BusinessDay(n=1)
この例では、BusinessHour
オフセットの値を 1 に丸めます。
import pandas as pd
offset = pd.tseries.offsets.BusinessHour(n=3.5)
normalized_offset = offset.normalize()
print(normalized_offset)
BusinessDay(n=1)
この例では、BusinessHour
オフセットの開始日と終了日を午前 0 時と午後 0 時に丸め、オフセットの値を 1 に丸めます。
import pandas as pd
offset = pd.tseries.offsets.BusinessHour(start='2024-07-04 10:00', end='2024-07-04 16:00', n=3.5)
normalized_offset = offset.normalize()
print(normalized_offset)
BusinessDay(n=1)
normalize
メソッドは、start
およびend
パラメータで指定された開始日と終了日が有効な日付であることを確認しません。無効な日付が指定された場合、予期しない結果が生じる可能性があります。
カスタムロジック
最も柔軟な方法は、カスタムロジックを使用してオフセットを正規化することです。これは、start
および end
パラメータで指定された開始日と終了日、およびオフセットの値を個別に処理する必要がある場合に役立ちます。
def normalize_offset(offset):
# 開始日と終了日を午前0時と午後0時に丸める
start = offset.start.replace(hour=0, minute=0, second=0, microsecond=0)
end = offset.end.replace(hour=0, minute=0, second=0, microsecond=0)
# オフセットの値を1に丸める
n = int(round(offset.n, 0))
# 正規化されたオフセットを作成する
normalized_offset = pd.tseries.offsets.BusinessHour(start=start, end=end, n=n)
return normalized_offset
この方法の利点は、非常に柔軟性が高いことです。欠点は、コードが複雑になり、メンテナンスが難しくなる可能性があることです。
pandas.tseries.offsets.DateOffset
pandas.tseries.offsets.DateOffset
オフセットを使用して、オフセットを正規化することもできます。DateOffset
オフセットは、BusinessHour
オフセットよりも汎用性が高く、さまざまな種類のオフセットを表現するために使用できます。
import pandas as pd
offset = pd.tseries.offsets.BusinessHour(start='10:00', end='16:00', n=2)
# オフセットをDateOffsetに変換する
date_offset = offset.to_offset()
# DateOffsetを正規化する
normalized_offset = date_offset.normalize()
# DateOffsetをBusinessHourに変換する
normalized_business_hour_offset = normalized_offset.to_business_hour()
print(normalized_business_hour_offset)
この方法の利点は、DateOffset
オフセットが汎用性が高く、さまざまな種類のオフセットを表現するために使用できることです。欠点は、BusinessHour
オフセットよりも冗長なコードになる可能性があることです。
pandas-tsutils ライブラリ
pandas-tsutils
ライブラリには、normalize_business_hour
関数が含まれており、BusinessHour
オフセットを簡単に正規化できます。
import pandas as pd
from pandas_tsutils.offsets import normalize_business_hour
offset = pd.tseries.offsets.BusinessHour(start='10:00', end='16:00', n=2)
normalized_offset = normalize_business_hour(offset)
print(normalized_offset)
この方法の利点は、コードが簡潔で読みやすいことです。欠点は、pandas-tsutils
ライブラリを別途インストールする必要があることです。