Pandas Period で閏年を判定する: 'pandas.Period.is_leap_year' の詳細解説


pandas.Period.is_leap_year は、pandasライブラリで扱うPeriodオブジェクトの年が閏年かどうかを判定する属性です。

使い方

import pandas as pd

# Periodオブジェクトを作成
period = pd.Period('2020')

# 'period'の年が閏年かどうかを判定
print(period.is_leap_year)  # True

上記の例では、2020年は閏年であるため、Trueが出力されます。

仕組み

pandas.Period.is_leap_yearは、以下の規則に基づいて閏年かどうかを判定します。

  • 400年に1回の例外
    さらに、400で割り切れる年は閏年です。
  • 100年に1回の例外
    ただし、100で割り切れる年は閏年ではありません。
  • 4年に1回の閏年
    一般的に知られているように、4年に1回閏年があります。
  • この機能は、主に時間軸データの分析や可視化において役立ちます。例えば、過去の閏年に発生したイベントを抽出したり、閏年の影響を考慮した指標を計算したりするのに利用できます。
  • 判定対象となるのは、Periodオブジェクトの年のみです。月や日については判定できません。
  • pandas.Period.is_leap_yearは、属性なので、メソッドのようにカッコで呼び出す必要はありません。


例1:特定の年の判定

import pandas as pd

# 特定の年のPeriodオブジェクトを作成
year = 2024
period = pd.Period(year)

# 'period'の年が閏年かどうかを判定
print(period.is_leap_year)  # False

例2:リスト内の年の判定

import pandas as pd

# 年のリストを作成
years = [1900, 1901, 1902, 1903, 1904]

# 各年の閏年判定結果をリストに格納
is_leap_years = []
for year in years:
    period = pd.Period(year)
    is_leap_years.append(period.is_leap_year)

# 結果を出力
print(is_leap_years)  # [False, False, False, True, True]

例3:データフレームへの適用

import pandas as pd

# データフレームを作成
df = pd.DataFrame({
    'date': pd.to_datetime(['2020-01-01', '2021-01-01', '2022-01-01', '2023-01-01', '2024-01-01'])
})

# 'date'列をPeriodに変換
df['period'] = df['date'].dt.to_period()

# 'period'列の各年の閏年判定結果を列に格納
df['is_leap_year'] = df['period'].is_leap_year

# 結果を出力
print(df)
        date          period  is_leap_year
0 2020-01-01  2020-01-01       True
1 2021-01-01  2021-01-01       False
2 2022-01-01  2022-01-01       False
3 2023-01-01  2023-01-01       False
4 2024-01-01  2024-01-01       True
  • 閏年の判定には、より高度なライブラリやツールを使用する場合もあります。例えば、dateutilライブラリなどがあります。
  • 実際のデータ分析では、より複雑な条件で閏年かどうかを判定する必要がある場合もあります。例えば、特定の国や地域における閏年の規則を考慮する必要がある場合などです。


手動で判定する

最もシンプルな代替方法は、以下の規則に基づいて手動で判定することです。

  • 400年に1回の例外
    さらに、400で割り切れる年は閏年です。
  • 100年に1回の例外
    ただし、100で割り切れる年は閏年ではありません。
  • 4年に1回の閏年
    一般的に知られているように、4年に1回閏年があります。
import pandas as pd

def is_leap_year(year):
    if year % 4 != 0:
        return False
    elif year % 100 == 0 and year % 400 != 0:
        return False
    else:
        return True

# Periodオブジェクトを作成
period = pd.Period('2020')

# 手動で判定
is_leap_year_manual = is_leap_year(period.year)
print(is_leap_year_manual)  # True

利点

  • 外部ライブラリを必要としない。
  • コードがシンプルで分かりやすい。

欠点

  • 計算処理が重くなる可能性がある。
  • 複雑な条件になるとコードが冗長になる。

datetime モジュールの calendar.isleap() 関数を使う

datetime モジュールには、calendar.isleap() 関数という、特定の年の閏年かどうかを判定する関数があります。この関数は、pandas.Period オブジェクトだけでなく、一般の datetime オブジェクトにも使用できます。

import pandas as pd
import calendar

# Periodオブジェクトを作成
period = pd.Period('2020')

# calendar.isleap() 関数を使って判定
is_leap_year_calendar = calendar.isleap(period.year)
print(is_leap_year_calendar)  # True

利点

  • 処理速度が速い。
  • 標準ライブラリの関数なので、外部ライブラリを必要としない。

欠点

  • pandas.Period オブジェクトに特化した機能ではない。

NumPy の np.mod 関数と np.equal 関数を使う

NumPy ライブラリの np.mod 関数と np.equal 関数を使って、以下の式で閏年かどうかを判定できます。

import pandas as pd
import numpy as np

# Periodオブジェクトを作成
period = pd.Period('2020')

# NumPyを使って判定
is_leap_year_numpy = np.equal(np.mod(period.year, 4), 0) & ~np.equal(np.mod(period.year, 100), 0) | np.equal(np.mod(period.year, 400), 0)
print(is_leap_year_numpy)  # True

利点

  • ベクター化処理が可能なので、高速に判定できる。
  • NumPy ライブラリのインポートが必要。
  • コードが少し複雑になる。