pandasのdataframeで、datetime型のカラムを月毎に変換する方法(”年月日”から”年月”を作成)

pandas_logo pandas
スポンサーリンク

こんにちは。カルークです。

今回は、pandas dataframeでdatetime型のカラムを月毎に変換する方法をご紹介します。

貰ったデータセットがyyyyMMddだったり、yyyyMMdd hh:mm:ssなど細かい粒度になっているが、月毎に集計したいシーンなどに使えるかと思います。

スポンサーリンク

やりたいこと

以下のようなDataframeがあって、生年月日のカラムがあります。(”年-月-日”の形式)

この”年-月-日”のカラムから、月単位(”年-月”の形式)のカラムを作成するのが今回やりたいことです。

実行環境

今回はGoogle Colabo(正式名称「Colaboratory」)で実験したいと思います。

Pandasのversionは1.3.5でした。

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

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

出力結果:

実装方法

データセット

はじめにデータセットを作成します。今回はサンプルとして以下のようなDataframeを定義しました。

df1 = pd.DataFrame(
    data={'name': ["Suzuki Ichiro", "Tanaka Jiro", "Sato Saburo"],
          'Birthday': ['1998-03-01', '1982-08-20', '2001-10-01']}
)

display(df1)

出力は以下のようになります。

本題に移る前に、”Birthday”カラムは文字列(Object型)になっているので、以下の流れに沿ってdatetime型に変換しておきます。

# 各columnの型を確認
df1.dtypes

出力すると、以下のように現状のBirthdayカラムはObjectになっているのが確認できます。

そこで、Birthday columnのtypeをdatetimeに変換します。

# Birthday columnのtypeをdatetimeに変換する
df1["Birthday"] = pd.to_datetime(df1["Birthday"])

もう一度、dtypeで型を確認します。

df1.dtypes

出力結果を見ると、ちゃんとdatetime型になっているのが確認できました。

補足: 日付のカラムのフォーマットが独特な場合

日付のカラムのフォーマットが独特な場合(例えば、”1989#03#04″など年月日の間がシャープ(#)で区切られている謎のフォーマットなど)、to_datetimeでうまく変換がされない場合があります。その場合でも、to_datetimeの引数”format”に定義を指定すればちゃんと変換が出来ます。詳しくは、過去の記事をご覧下さい。

実装

ここからが本題です。月毎に集計したい場合は、”datetime”というlibのto_periodという関数を使うと簡単に実装出来ます。

# datetimeのインポート
import datetime as dt

# 月毎のBirthdayを新しいカラムとして作成
df1["Birthday_Month"] = df1["Birthday"].dt.to_period("M")

dataframeを確認してみると、年月日から年月(月毎)のカラムが作成出来ているのが確認できました。

ちなみに、to_periodの引数に”Y”(Year)を指定すると、年ごとに集計することが出来ます。(他にも、”D”を指定すると日毎だったり)

df1["Birthday_Year"] = df1["Birthday"].dt.to_period("Y")

フィルタをかけての検索も簡単

作成されたdataframeですが、Monthでフィルタをかけることが出来ます。

例えば、誕生日が2000年01月以降の人を抽出したい場合、以下のような感じです。

df1[df1["Birthday_Month"]>"2000-01"].head()

出力を見ると、2000年1月より後の人にフィルタされているのが確認出来ます。

まとめ

今回は、pandas dataframeでdatetime型のカラムを月毎に変換する方法をご紹介致しました。

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