こんにちは。カルークです。
今回は、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型のカラムを月毎に変換する方法をご紹介致しました。