こんにちは。カルークです。今回は、Pandas Dataframeのdatetime型のカラムに対する加算や減算の方法についてまとめます。
用途としては、例えば誕生日などの日付が入ったカラムがあった時、それに対して1歳記念日や10歳記念日などを計算するのに役立ちます。
実行環境および必要ライブラリのインポート
今回はGoogle Colaboratoryを実行環境として用いました。pandasのバージョンは1.4.4を利用します。また、datetime型に対して加算・減算を行うにはrelativedeltaというライブラリを用います。
pandasのインポート
# Pandasのインポート
import pandas as pd
# Pandasのバージョンを出力
print(pd.__version__)
relativedeltaのインポート
以下のように、relativedeltaをインポートしておきます。
from dateutil.relativedelta import relativedelta
データセットの準備
今回は以下のようなDataframeを作成します。各お名前に対して誕生日が載っているようなテーブルデータです。
df = pd.DataFrame(
data={'name': ["Aoyama Ichiro", "Takahashi Jiro", "Honda Saburo"],
'Birthday': ['1974-03-01', '1982-08-20', '1994-10-05']}
)
display(df)
前処理
relativedeltaはdatetime型のカラムに対して使えるので、relativedeltaの適用対象カラムがdatetime型になっているか確認します。dataframeに対して、info()で各columnの型を調べます。(.dtypesを使うでもOK)
df.info()
info()の出力を見た所、relativedeltaの適用対象のBirthdayがObject型(文字列)になっています。to_datetime()を使ってdatetime型に変換しておきましょう。
df["Birthday"] = pd.to_datetime(df["Birthday"])
もう一度、df.info()で型を調べて、ちゃんとdatetime型に変換できているのを確認します。
(補足)Birthdayカラムのフォーマットが特殊でto_datetime()でエラーが出たり、正しくdatetime型に変換出来ていない場合は、to_datetime()の引数でフォーマットを指定する必要があります。to_datetime()でのフォーマット指定方法については、以下の記事をご参照下さい。
relativedeltaでdatetime型カラムに対する加算・減算を計算
relativedeltaを用い、Birthdayに対して、20日後記念日、3ヶ月後記念日、1歳記念日を計算し、新しいカラムに保存してみます。全てのレコードに適用したいので、applyを使って実行します。
df["20_days_anniversary"] = df["Birthday"].apply(lambda x: x + relativedelta(days=20))
df["3_month_anniversary"] = df["Birthday"].apply(lambda x: x + relativedelta(months=3))
df["1_year_anniversary"] = df["Birthday"].apply(lambda x: x + relativedelta(years=1))
実行結果は以下のようになります。
Birthdayに対して、20日後、3ヶ月後、1年後がちゃんと計算できています。
同様に、減算も可能です。例えば、誕生日の10ヶ月前を算出してみましょう。その場合、relativedeltaのmonthsにマイナスの値を設定します。
df["10_months_to_birth"] = df["Birthday"].apply(lambda x: x + relativedelta(months=-10))
10_months_to_birthのカラムに、誕生日の10ヶ月前が計算出来ている事がわかります。
(補足)上記ではapply関数を使っていますが、applyの使い方について詳しく知りたい場合は以下の記事を参考にして下さい。
注意点:monthsとmonthを間違えないように!
relativedeltaの引数months(複数形)をmonth(単数形)にしてしまうと、「Nヶ月後」ではなく、N月を指定する意味になってしまうので注意が必要です。
例えば、”1974-03-01″に対して5ヶ月後(“1974-08-01”)を算出したい場合にはmonths=5とすべきです。これを誤ってmonth=5としてしまうと、”5月”である”1974-05-01″が出力されてしまいます。
以下に実際のコードを記載します。間違い例のmonth=5と指定した場合、3人ともBirthdayが5月に書き換わっただけになります。
このように、単数・複数を間違えただけで全然意味が異なってしまうので注意しましょう。
まとめ
今回は、Pandas Dataframeのdatetime型のカラムに対する加算や減算の方法についてまとめました。使ったライブラリはrelativedeltaです。記事後半にはrelativedeltaを使う時の注意点についても纏めてあります。