pandas dataframeにおけるdatetime型同士の差分の月数を計算する方法

pandas_logo pandas
スポンサーリンク

こんにちは。カルークです。今回は、pandas dataframeにおいて、2つのdatetime型のカラム同士の月数の差分を算出する方法についてまとめます。

スポンサーリンク

実行環境および必要ライブラリのインポート

今回はGoogle Colaboratoryを実行環境として用いました。pandasのバージョンは1.4.4を利用します。また、datetime型同士の差分月を計算する為、”MonthDelta”というライブラリ(バージョン 0.9.1)を利用します。”MonthDelta”はデフォルトのGoogle Colabでは使えないので、自分でインストールする必要があります。以下にコードと実行結果を載せます。

pandasのインポート

# Pandasのインポート
import pandas as pd

# Pandasのバージョンを出力
print(pd.__version__)

MonthDeltaのインストールおよびインポート

以下のようにして、MonthDeltaのインストールおよびインポートを行います。なお、インストール(pip install)は初回だけ行えばOKです。2回目以降実行する時は、コメントアウトしておくと良いです(コメントアウトしなくても”Requirement already satisfied”(既にインストール済み)と言われるだけで、実行エラーにはなりません)。

# MonthDeltaのインストール(初回のみでOK)
!pip install MonthDelta

# MonthDeltaのライブラリインポート
from monthdelta import monthmod

MonthDeltaの細かい仕様については、ドキュメントをご覧下さい。

データセットの準備

今回は以下のようなDataframe(テーブルデータ)を作成します。

df = pd.DataFrame(
    data={'名前': ["Suzuki Ichiro", "Tanaka Jiro", "Sato Saburo", "Watanabe Shiro"],
          '入会日': ['2019-03-01', '2019-01-10', '2022-10-01', '2020-01-02'],
          '退会日': ['2022-01-25', '2019-02-02', '2023-03-20', '2020-02-28']}
)

前処理

MonthDeltaで月数の差分を計算するには、対象カラムの型がdatetime型である必要があります。まずは、対象のdataframeの型が何であるのかを”.dtypes”で確認してみましょう。

df.dtypes

“.dtype”で各columnの型を見たところ、object型となっています。そこで、pandasのto_datetime()を使ってdatetime型に変換しておきましょう。

df["入会日"] = pd.to_datetime(df["入会日"])
df["退会日"] = pd.to_datetime(df["退会日"])

念の為、object型からdatetime型にちゃんと変換できているかも確認しておきましょう。

(補足)今回、to_datetimeを使ってobjectからdatetimeに正しく変換が出来ましたが、日付のフォーマットが特殊(例えば、”2023/04/01″ではなく、”2023*04*01″など)な場合は、to_datetime()の引数にフォーマットを指定する必要があります。詳しくは過去の記事をご覧下さい。

月数の差分を計算

ここまでで、必要なデータセットの準備が終わったので、月数の差分を計算してみたいと思います。

ここでは、”monthmod()”というmethodを使って、「入会日」と「退会日」の差分の月数を計算し、新たに「継続時間(ヶ月)」というカラムを作成したいと思います。

ちなみに”monthmod()”の出力そのままだと、”(34 months, 24 days 00:00:00)”のように何ヶ月何日何時間までの細かな情報が出てきてしまうので、月数のみ取り出す場合は[0].monthsを後ろにつけます。

今回はdataframeの各レコードに対して適用したいので、applyを使って以下のように実装します。

def calc_delta_month(row):
  return monthmod(row["入会日"], row["退会日"])[0].months

df["継続時間(ヶ月)"] = df.apply(calc_delta_month, axis=1)

実行結果を以下に載せます。「継続時間(ヶ月)」の列が新たに作成されて、入会日と退会日の差分月数が入っているのが分かります。ちなみに、monthmod()の引数にある「row[“入会日”]とrow[“退会日”]を逆にすると、符号(プラス、マイナス)も逆になるのでご注意下さい。

(補足)”apply()”の使い方について詳しく知りたい場合は過去の記事をご覧下さい。

まとめ

今回は、Pandas Dataframeにおいて、2つのdatetime型のカラム同士の月数の差分の算出方法についてまとめました。計算に用いたライブラリはMonthDeltaでした。

タイトルとURLをコピーしました