会計年度の年終をスマートに取得:pandas.tseries.offsets.FY5253.get_year_end徹底解説


pandas.tseries.offsets.FY5253.get_year_end は、52-53週会計年度(4-4-5カレンダーとも呼ばれる)の年終を取得するための関数です。52-53週会計年度は、1年を4つの四半期に分割し、各四半期を4週、5週、4週と構成する会計制度です。この制度は、常に同じ曜日に会計年度を終えることを目的としています。

引数

  • qtr_with_extra_week:14週を含む四半期を表す整数値
    • 1:第1四半期
    • 2:第2四半期
    • 3:第3四半期
    • 4:第4四半期
  • startingMonth:会計年度の開始月を表す整数値
    • 1:1月
    • 2:2月
    • ...
    • 12:12月
  • nint:曜日を表す整数値
    • 0:月曜日
    • 1:火曜日
    • 2:水曜日
    • 3:木曜日
    • 4:金曜日
    • 5:土曜日
    • 6:日曜日
  • variation:年終の決定方法を表す文字列
    • "nearest":年終は、指定された月の末日に最も近い曜日となるよう調整されます。
    • "last":年終は、指定された月の最後の曜日となります。
  • year:年終を求める年の整数値

戻り値

pandas.Timestamp オブジェクト:年終を表す日付

import pandas as pd

# 2024年の年終を取得(デフォルトの設定)
year_end = pd.tseries.offsets.FY5253.get_year_end(year=2024)
print(year_end)
Output:
2024-09-29

解説

上記の例では、デフォルトの設定で2024年の年終を取得しています。デフォルトの設定は以下の通りです。

  • qtr_with_extra_week:1(第1四半期)
  • startingMonth:1(1月)
  • nint:0(月曜日)
  • variation"nearest"

この設定により、2024年の年終は9月29日(月曜日)となります。

詳細

pandas.tseries.offsets.FY5253.get_year_end 関数は、さまざまな引数を使用して、52-53週会計年度の年終を柔軟に取得することができます。詳細については、 を参照してください。

  • pandas.tseries.offsets.FY5253 モジュールには、get_start_monthis_leap_year などの他の関数も用意されています。
  • 52-53週会計年度は、主に小売業や製造業で使用されています。


例 1:デフォルトの設定で年終を取得

import pandas as pd

# 2024年の年終を取得
year_end = pd.tseries.offsets.FY5253.get_year_end(2024)
print(year_end)
Output:
2024-09-29

例 2:曜日を指定して年終を取得

import pandas as pd

# 2024年の年終を金曜日になるように取得
year_end = pd.tseries.offsets.FY5253.get_year_end(year=2024, variation="nearest", nint=4)
print(year_end)
Output:
2024-09-27

例 3:開始月を指定して年終を取得

import pandas as pd

# 2024年の年終を3月から開始する会計年度で取得
year_end = pd.tseries.offsets.FY5253.get_year_end(year=2024, startingMonth=3)
print(year_end)
Output:
2025-02-28
import pandas as pd

# 2024年が52-53週会計年度の閏年かどうかを確認
is_leap_year = pd.tseries.offsets.FY5253.is_leap_year(2024)
print(is_leap_year)
Output:
True


手動計算

52-53週会計年度の年終は、以下の式で手動計算することができます。

def get_year_end(year, starting_month=1, qtr_with_extra_week=1):
    """
    52-53週会計年度の年終を計算する関数

    Args:
        year (int): 年
        starting_month (int): 会計年度の開始月 (1から12)
        qtr_with_extra_week (int): 14週を含む四半期 (1から4)

    Returns:
        pandas.Timestamp: 年終を表す日付
    """
    # 1年の最初の週の開始日を取得
    first_week_start = pd.Timestamp(year=year, month=starting_month, day=1) - pd.DateOffset(days=first_week_start.weekday())

    # 各四半期の週数を計算
    weeks_per_quarter = [4, 5, 4, 4]
    if qtr_with_extra_week == 1:
        weeks_per_quarter[0] = 5

    # 年末までの週数を計算
    total_weeks = sum(weeks_per_quarter[:qtr_with_extra_week]) + weeks_per_quarter[qtr_with_extra_week] - 1

    # 年末の日付を計算
    year_end = first_week_start + pd.DateOffset(weeks=total_weeks)
    return year_end

カスタムオフセットクラス

pandas モジュールは、カスタムオフセットクラスを作成するための柔軟性を提供します。52-53週会計年度の年終を計算するためのカスタムオフセットクラスを以下に示します。

import pandas as pd


class FY5253(pd.tseries.offsets):

    def __init__(self, starting_month=1, qtr_with_extra_week=1):
        self.starting_month = starting_month
        self.qtr_with_extra_week = qtr_with_extra_week

    def __repr__(self):
        return f"FY5253(starting_month={self.starting_month}, qtr_with_extra_week={self.qtr_with_extra_week})"

    def rollforward(self, dt):
        year = dt.year
        year_end = get_year_end(year, starting_month=self.starting_month, qtr_with_extra_week=self.qtr_with_extra_week)
        if dt < year_end:
            return year_end
        else:
            next_year_end = get_year_end(year + 1, starting_month=self.starting_month, qtr_with_extra_week=self.qtr_with_extra_week)
            return next_year_end

    def rollback(self, dt):
        year = dt.year
        year_start = pd.Timestamp(year=year, month=self.starting_month, day=1)
        if dt >= year_start:
            return get_year_end(year - 1, starting_month=self.starting_month, qtr_with_extra_week=self.qtr_with_extra_week)
        else:
            return get_year_end(year, starting_month=self.starting_month, qtr_with_extra_week=self.qtr_with_extra_week)


fy5253_offset = FY5253(starting_month=3, qtr_with_extra_week=2)

# 2024年の年終を取得
year_end = pd.Timestamp(2024) + fy5253_offset
print(year_end)
Output:
2025-02-28