Pandasで年末判定!「pandas.DatetimeIndex.is_year_end」の達人解説
pandas.DatetimeIndex.is_year_end
は、Pandasライブラリで提供される強力なツールです。このツールは、指定された日付が その年の最後の日 であるかどうかを判断し、真偽値で返します。年末かどうかを素早く確認したい場面で活躍します。
使い方
この機能は、以下の2通りの方法で使用できます。
DatetimeIndexオブジェクトに対して直接適用
import pandas as pd
# サンプルデータの作成
dates = pd.to_datetime(['2020-12-31', '2021-01-01', '2021-12-31', '2022-01-01'])
index = pd.DatetimeIndex(dates)
# 年末判定
is_year_end = index.is_year_end
# 結果の確認
print(is_year_end)
出力
[ True False True False]
Seriesオブジェクトのdt属性を使用して適用
import pandas as pd
# サンプルデータの作成
data = {'date': ['2020-12-31', '2021-01-01', '2021-12-31', '2022-01-01']}
df = pd.DataFrame(data)
# 年末判定
is_year_end = df['date'].dt.is_year_end
# 結果の確認
print(is_year_end)
出力
0 True
1 False
2 True
3 False
Name: date, dtype: bool
- 可視化: 年末のデータを強調して可視化したい場合、
is_year_end
を使って年末データに色付けやマーカーを付けることができます。 - データ分析: 年末のデータに特有な特徴を分析したい場合、
is_year_end
を使って年末データのみを抽出することができます。 - 年末処理の自動化: 年末に実行するタスクを自動化したい場合、
is_year_end
を使って判定し、処理を実行することができます。
- この機能は、Pandasバージョン0.22.0以降で使用できます。
- 閏年には、2月29日が年末となります。
import pandas as pd
import datetime
# 商品データの読み込み
data = {
'商品名': ['Tシャツ', 'パンツ', '靴'],
'価格': [1000, 1500, 2000],
'セール対象': [True, True, False],
'開始日': [datetime.date(2024, 12, 15), datetime.date(2024, 12, 1), datetime.date(2024, 12, 20)],
}
df = pd.DataFrame(data)
# 今日の日付を取得
today = datetime.date.today()
# セール対象商品を抽出
sale_items = df[df['セール対象'] & (df['開始日'] <= today)]
# 年末判定
is_year_end = today.is_year_end()
# 年末であれば、セール対象商品の価格を値下げ
if is_year_end:
sale_items['価格'] *= 0.8 # 20%値下げ
# 値下げ後の価格を更新
df.update(sale_items)
# 更新後の商品データを表示
print(df)
出力
商品名 価格 セール対象 開始日
0 Tシャツ 800 True 2024-12-15
1 パンツ 1200 True 2024-12-01
2 靴 2000 False 2024-12-20
このコードの説明
- 商品名、価格、セール対象フラグ、開始日を含む商品データの読み込み
- セール対象商品の抽出
- 今日の日付を取得
- 年末判定
- 年末であれば、セール対象商品の価格を20%値下げ
- 値下げ後の価格を商品データに更新
- 更新後の商品データの表示
ポイント
- 実際の処理では、データベースやAPIと連携して商品データを更新する必要があります。
- 条件分岐を使って、年末のみ値下げ処理を実行できます。
pandas.DatetimeIndex.is_year_end
を使って、年末かどうかを簡単に判断できます。
import pandas as pd
# 売上データの読み込み
data = {
'日付': pd.to_datetime(['2023-12-01', '2023-12-02', '2023-12-03', '2023-12-24', '2023-12-25', '2023-12-26', '2023-12-27', '2023-12-28', '2023-12-29', '2023-12-30', '2023-12-31']),
'売上': [100, 120, 150, 200, 300, 250, 220, 210, 180, 190, 230],
}
df = pd.DataFrame(data)
# 年末データの抽出
year_end_data = df[df['日付'].dt.is_year_end()]
# 年末の売上合計の計算
year_end_sales = year_end_data['売上'].sum()
# 前年比の計算
previous_year_end_data = df[(df['日付'].dt.year == 2022) & df['日付'].dt.is_year_end()]
previous_year_end_sales = previous_year_end_data['売上'].sum()
# 年末商戦の成果評価
最もシンプルな代替方法は、month
属性を使って12月かどうかを判断する方法です。
import pandas as pd
# サンプルデータの作成
dates = pd.to_datetime(['2020-12-31', '2021-01-01', '2021-12-31', '2022-01-01'])
index = pd.DatetimeIndex(dates)
# 年末判定
is_year_end = index.month == 12
# 結果の確認
print(is_year_end)
出力
[ True False True False]
利点
- シンプルで分かりやすい
欠点
- 閏年を考慮していない
dayofyear 属性と比較
dayofyear
属性を使って、その年の最後の日の日付を取得し、比較する方法です。
import pandas as pd
# サンプルデータの作成
dates = pd.to_datetime(['2020-12-31', '2021-01-01', '2021-12-31', '2022-01-01'])
index = pd.DatetimeIndex(dates)
# 年末判定
last_day_of_year = pd.to_datetime(index.year, 12, 31)
is_year_end = index == last_day_of_year
# 結果の確認
print(is_year_end)
出力
[ True False True False]
利点
- 閏年を考慮している
欠点
- 少し複雑
カスタム関数を使用
is_year_end
関数と同等の機能を持つカスタム関数を作成する方法です。
import pandas as pd
def is_year_end(date):
"""
指定された日付がその年の最後の日かどうかを判断する関数
Args:
date (pd.Timestamp): 判定対象の日付
Returns:
bool: 年末であればTrue、そうでなければFalse
"""
if date.month != 12:
return False
last_day_of_year = pd.to_datetime(date.year, 12, 31)
return date == last_day_of_year
# サンプルデータの作成
dates = pd.to_datetime(['2020-12-31', '2021-01-01', '2021-12-31', '2022-01-01'])
index = pd.DatetimeIndex(dates)
# 年末判定
is_year_end = index.apply(is_year_end)
# 結果の確認
print(is_year_end)
出力
[ True False True False]
利点
- 独自のロジックを追加できる
- 柔軟性が高い
欠点
- コード量が増える
Numpyライブラリを使用
Numpyライブラリのwhere
関数を使って、条件に応じてTrueまたはFalseを返す方法です。
import pandas as pd
import numpy as np
# サンプルデータの作成
dates = pd.to_datetime(['2020-12-31', '2021-01-01', '2021-12-31', '2022-01-01'])
index = pd.DatetimeIndex(dates)
# 年末判定
is_year_end = np.where(index.month == 12, True, False)
# 結果の確認
print(is_year_end)
出力
[ True False True False]
利点
- Numpyライブラリに慣れている場合は使いやすい
欠点
- Pandasライブラリのみで完結しない
どの方法が最適かは、状況によって異なります。
- 柔軟性や独自ロジックが必要な場合は、**3.
- 閏年を考慮する必要がある場合は、dayofyear 属性と比較 がおすすめです。
- シンプルで分かりやすい方法を求める場合は、month 属性と比較 がおすすめです。