【初心者向け】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 ライブラリを別途インストールする必要があることです。