pandas YearBegin を駆使してデータ分析をレベルアップ!サンプルコードで徹底解説


pandas.tseries.offsets.YearBegin は、pandasライブラリで提供される DateOffset クラスの一つであり、毎年1月1日 にオフセットするオブジェクトです。つまり、指定された日付を 次の年の1月1日 に移動します。

主な機能

  • 年始のタイミングで処理を実行する
  • 期間を年単位で区切る
  • 特定の日付を次の年の1月1日へ移動する

属性とメソッド

  • roll
    指定された日付をオフセット基準日(1月1日)にロールバック
  • freqstr
    オフセットの頻度を表す文字列を返す
  • is_year_end
    指定された日付が年の末日かどうかを判定
  • is_month_start
    指定された日付が月の初日かどうかを判定
  • is_on_offset
    指定された日付がオフセットの基準日(1月1日)かどうかを判定
  • normalize
    オフセット後の日付を標準化するかどうかのフラグ
  • day_offset
    オフセットする日数(常に1)
import pandas as pd

# 現在の日付
today = pd.Timestamp('2024-06-30')

# YearBeginオブジェクトを作成
year_begin = pd.tseries.offsets.YearBegin()

# 現在の日付をYearBeginでオフセット
next_year_start = year_begin.roll(today)

# 結果の確認
print(next_year_start)  # 2025-01-01 00:00:00
  • YearBegin を他のDateOffsetオブジェクトと組み合わせて、より複雑なオフセットを定義することもできます。
  • 例えば、毎年の売上データを分析したり、毎年の予算を設定したりする際に利用できます。
  • YearBegin は、毎年の年初を基準としたデータ分析や処理に役立ちます。
  • それぞれのオブジェクトの機能を理解することで、より柔軟なデータ分析が可能になります。
  • pandasには、YearBegin以外にも様々なDateOffsetオブジェクトが用意されています。


import pandas as pd

# サンプルデータ
data = {
    '日付': pd.to_datetime(['2020-01-01', '2020-02-01', '2020-03-01', '2021-01-01', '2021-02-01', '2021-03-01', '2022-01-01', '2022-02-01', '2022-03-01']),
    '売上高': [100, 120, 150, 180, 200, 220, 250, 280, 310]
}

df = pd.DataFrame(data)

# 毎年の売上高を計算
year_grouped_sales = df.groupby(pd.Grouper(level='日付', freq='Y'))['売上高'].sum()

# 結果の確認
print(year_grouped_sales)

# 出力結果
#         売上高
# 年齢     
# 2020    470
# 2021    500
# 2022    840

解説

  • その後、sum() メソッドを使って、各年の売上高を合計しています。
  • groupby 関数と Grouper オブジェクトを使用して、日付を年ごとにグループ化しています。
  • この例では、YearBegin を使って毎年の売上高を計算しています。

例2:毎年の予算を設定する

import pandas as pd

# 予算データ
budget = {
    '年': [2020, 2021, 2022],
    '予算額': [1000000, 1200000, 1500000]
}

df_budget = pd.DataFrame(budget)

# 予算開始日を取得
budget_start_dates = df_budget['年'].apply(pd.Timestamp) + pd.offsets.YearBegin()

# 結果の確認
print(budget_start_dates)

# 出力結果
# 0    2020-01-01
# 1    2021-01-01
# 2    2022-01-01
# Name: 年, dtype: datetime64[ns]

解説

  • 予算開始日は、その年の1月1日になります。
  • apply() メソッドを使って、YearBegin オブジェクトを各年の値に適用しています。
  • この例では、YearBegin を使って毎年の予算開始日を計算しています。

例3:毎年のデータ処理を実行する

import pandas as pd
import datetime

# データ処理関数
def process_data(year):
    # 処理内容を記述
    print(f'年 {year} のデータ処理を実行中...')
    # 処理内容を記述

# 対象期間
start_year = 2020
end_year = 2022

# 各年の処理を実行
for year in range(start_year, end_year + 1):
    year_start_date = datetime.datetime(year, 1, 1) + pd.offsets.YearBegin()
    process_data(year_start_date.year)

解説

  • 取得した日付を処理関数に渡して、データ処理を実行しています。
  • YearBegin オブジェクトを使って、その年の1月1日を取得しています。
  • range() 関数を使って、対象期間の各年をループしています。
  • この例では、YearBegin を使って毎年のデータ処理を実行しています。

pandas.tseries.offsets.YearBegin は、毎年の年初を基準としたデータ分析や処理に役立つオブジェクトです。



pandas.Timestamp と timedelta を組み合わせる

単純な代替方法として、pandas.Timestamppandas.DateOffset を組み合わせて、次の年の1月1日に移動することができます。

import pandas as pd

# 現在の日付
today = pd.Timestamp('2024-06-30')

# 次の年の1月1日
next_year_start = today + pd.DateOffset(years=1) + pd.offsets.Day(1)

# 結果の確認
print(next_year_start)

この方法では、YearBegin オブジェクトと同様の機能を実現できますが、コードが少し長くなります。

pandas.Grouper を使用する

データフレームを年ごとにグループ化したい場合は、pandas.Grouper を使用することができます。

import pandas as pd

# サンプルデータ
data = {
    '日付': pd.to_datetime(['2020-01-01', '2020-02-01', '2020-03-01', '2021-01-01', '2021-02-01', '2021-03-01', '2022-01-01', '2022-02-01', '2022-03-01']),
    '売上高': [100, 120, 150, 180, 200, 220, 250, 280, 310]
}

df = pd.DataFrame(data)

# 毎年の売上高を計算
year_grouped_sales = df.groupby(pd.Grouper(level='日付', freq='Y'))['売上高'].sum()

# 結果の確認
print(year_grouped_sales)

この方法では、YearBegin オブジェクトを使用せずに、毎年のデータを集計することができます。

カスタム DateOffset クラスを作成する

より柔軟なオフセットが必要な場合は、カスタム DateOffset クラスを作成することができます。

import pandas as pd

class MyYearBegin(pd.tseries.offsets.DateOffset):

    def roll(self, dt):
        if dt.month == 1 and dt.day == 1:
            return dt
        else:
            return dt + pd.DateOffset(years=1)

# カスタム DateOffset オブジェクトを作成
my_year_begin = MyYearBegin()

# 現在の日付
today = pd.Timestamp('2024-06-30')

# 次の年の1月1日
next_year_start = my_year_begin.roll(today)

# 結果の確認
print(next_year_start)

この方法では、YearBegin オブジェクトの挙動をカスタマイズすることができます。