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.Timestamp
と pandas.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
オブジェクトの挙動をカスタマイズすることができます。