Pythonでデータ分析の柔軟性を高める:`CustomBusinessDay` オフセットの使い方


Pandasライブラリは、データ分析や可視化に欠かせないツールです。データオフセット機能は、時間軸に沿ったデータ操作を可能にし、分析の効率化に役立ちます。pandas.tseries.offsets.CustomBusinessDay.freqstr は、カスタムビジネスデイオフセットを表す文字列を生成する関数です。この関数は、時間軸上の特定の日付間隔を定義し、データ分析に柔軟性をもたらします。

CustomBusinessDay オフセットとは?

CustomBusinessDay オフセットは、ビジネスデイに基づいたカスタムの日付間隔を定義します。ビジネスデイとは、一般的に土曜日と日曜日以外の平日のことを指します。CustomBusinessDay オフセットでは、以下のオプションを指定することで、より詳細な間隔を設定できます。

  • calendar
    カスタムの休日カレンダーオブジェクト。
  • holidays
    祝日として除外する日付のリスト。
  • weekmask
    有効なビジネスデイを表す文字列。デフォルトは "Mon Tue Wed Thu Fri" で、月曜日から金曜日までの平日のみ有効です。
  • n
    オフセットの期間。正の値は未来の日付を、負の値は過去の датуを指定します。

freqstr 関数の役割

freqstr 関数は、CustomBusinessDay オフセットを表す文字列を生成します。この文字列は、オフセットの構成要素 (間隔、有効な曜日、祝日など) をコンパクトに表現します。

例:freqstr 関数の使用

import pandas as pd

# カスタムビジネスデイオフセットを作成
offset = pd.tseries.offsets.CustomBusinessDay(n=2, weekmask='Mon Tue Wed', holidays=['2024-01-01', '2024-12-25'])

# `freqstr` 関数を使用してオフセットを表す文字列を生成
freq_str = offset.freqstr()

print(freq_str)

上記のコードを実行すると、以下の出力が得られます。

CBDAY: 2 Tue Wed except 2024-01-01,2024-12-25

この出力は、CustomBusinessDay オフセットが2ビジネスデイの間隔で構成され、月曜日から水曜日までの平日のみ有効であることを示しています。また、2024年1月1日と2024年12月25日は祝日として除外されることも示しています。

pandas.tseries.offsets.CustomBusinessDay.freqstr 関数は、カスタムビジネスデイオフセットを表す文字列を生成し、データ分析における柔軟性を高めます。この関数は、時間軸上の特定の日付間隔を定義し、データ操作を効率化することができます。

  • freqstr 関数は、オフセットのすべての構成要素を文字列に含めるわけではありません。詳細な情報は、CustomBusinessDay オフセットのドキュメントを参照してください。


import pandas as pd

# カスタムビジネスデイオフセットを作成
offset = pd.tseries.offsets.CustomBusinessDay(
    n=2,  # オフセットの期間
    weekmask='Mon Tue Wed',  # 有効な曜日
    holidays=['2024-01-01', '2024-12-25'],  # 祝日
)

# サンプルデータを作成
dates = pd.date_range('2023-01-01', '2024-01-01', freq='D')

# オフセットをデータに適用
result = dates + offset

# 結果を表示
print(result)
  1. CustomBusinessDay オフセットを作成します。このオフセットは、2ビジネスデイの間隔で構成され、月曜日から水曜日までの平日のみ有効です。また、2024年1月1日と2024年12月25日は祝日として除外されます。
  2. date_range 関数を使用して、2023年1月1日から2024年1月1日までの毎日の日付を含むデータフレームを作成します。
  3. + 演算子を使用して、オフセットをデータフレームに適用します。
  4. 結果を画面に出力します。

出力結果は以下のようになります。

2023-01-03    NaT
2023-01-04    NaT
2023-01-09    NaT
2023-01-10    NaT
2023-01-11    NaT
...
2023-12-26    NaT
2023-12-27    NaT
2023-12-28    NaT
2023-12-29    NaT
2024-01-02    NaT


オフセットオブジェクトを直接表示

最も簡単な代替方法は、CustomBusinessDay オフセットオブジェクトを直接表示することです。

import pandas as pd

offset = pd.tseries.offsets.CustomBusinessDay(n=2, weekmask='Mon Tue Wed', holidays=['2024-01-01', '2024-12-25'])

print(offset)
<CustomBusinessDay: n=2, weekmask='Mon Tue Wed', holidays=[datetime.datetime(2024, 1, 1), datetime.datetime(2024, 12, 25)]>

この出力には、オフセットの構成要素 (間隔、有効な曜日、祝日など) が含まれています。ただし、この形式は人間にとって読みやすくなく、分析や可視化には不向きです。

文字列フォーマットを使用する

CustomBusinessDay オフセットオブジェクトは、strftime() 関数を使用してフォーマットされた文字列に変換することができます。

import pandas as pd

offset = pd.tseries.offsets.CustomBusinessDay(n=2, weekmask='Mon Tue Wed', holidays=['2024-01-01', '2024-12-25'])

formatted_offset = offset.strftime('%H:%M:%S')

print(formatted_offset)
CBDAY: 2 Tue Wed except 2024-01-01,2024-12-25

この形式は、freqstr 関数よりも簡潔で読みやすいですが、オフセットのすべての構成要素が含まれているわけではありません。

カスタム関数を使用する

より柔軟な代替方法として、カスタム関数を作成してオフセットを表す文字列を生成することができます。この関数には、必要な情報をすべて含めることができます。

import pandas as pd

def custom_freqstr(offset):
    """カスタムビジネスデイオフセットを表す文字列を生成する関数

    Args:
        offset (CustomBusinessDay): カスタムビジネスデイオフセットオブジェクト

    Returns:
        str: オフセットを表す文字列
    """
    n = offset.n
    weekmask = offset.weekmask
    holidays = offset.holidays

    # オフセットを表す文字列を生成
    freq_str = f"CBDAY: {n} {weekmask}"

    # 祝日がある場合は追加
    if holidays:
        holidays_str = ','.join([holiday.strftime('%Y-%m-%d') for holiday in holidays])
        freq_str += f" except {holidays_str}"

    return freq_str

offset = pd.tseries.offsets.CustomBusinessDay(n=2, weekmask='Mon Tue Wed', holidays=['2024-01-01', '2024-12-25'])

freq_str = custom_freqstr(offset)

print(freq_str)
CBDAY: 2 Tue Wed except 2024-01-01,2024-12-25

この方法は、最も柔軟性があり、オフセットに関するすべての情報を含めることができます。ただし、実装が複雑になる可能性があります。