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

このコードの説明

  1. 商品名、価格、セール対象フラグ、開始日を含む商品データの読み込み
  2. セール対象商品の抽出
  3. 今日の日付を取得
  4. 年末判定
  5. 年末であれば、セール対象商品の価格を20%値下げ
  6. 値下げ後の価格を商品データに更新
  7. 更新後の商品データの表示

ポイント

  • 実際の処理では、データベースや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 属性と比較 がおすすめです。