[python] pandasのdatetimeを日、時間、週などに丸める方法

 データの分析などを行っているとき、日付などを適したサイズに丸めることがよくあります。pandasではこれらが非常に簡単にできます。

データの事前準備

import pandas as pd
df = pd.DataFrame({'datetime': ['2018-04-01 12:59:40', '2019-05-01 01:22:43']})
df['datetime'] = pd.to_datetime(df['datetime']) # 文字列をdatetimeに変換する

丸め処理

 pandas.Series.dt.roundを利用します。

 このインターフェースは非常に便利で、日付や時間の丸め処理を簡単に行うことができます。通常は第一引数のfreqのみを指定してやれば十分でしょう。指定できるfreqについては、Offset Aliasesを参照してください。

 注意点として、round()は四捨五入のような振る舞いをします。もし切り捨てや切り上げが必要な場合は、後述する floor() ceil() を使用してください。

日に丸める場合

 Series.dt.round()に渡す第一引数を”D”にします。

df['datetime'] = df['datetime'].dt.round("D")
print(df)

 結果

    datetime
0 2018-04-02
1 2019-05-01

時間に丸める場合

 Series.dt.round()に渡す第一引数を”H”にします。

df['datetime'] = df['datetime'].dt.round("H")
print(df)

 結果

             datetime
0 2018-04-01 13:00:00
1 2019-05-01 01:00:00

15分ごとに丸める場合

 HやDの前に数字を付加することによって、自由自在に時間を丸めることができます。やってみましょう。

 Series.dt.round()に渡す第一引数を”15T”にします。

df['datetime'] = df['datetime'].dt.round("15T")
print(df)

 結果

             datetime
0 2018-04-01 13:00:00
1 2019-05-01 01:30:00

切り捨て・切り上げ

 切り捨て・切り上げを行いたいときは、 floor() や、 ceil() を利用します。

floor

df['datetime'] = df['datetime'].dt.floor("D")
print(df)

 結果

    datetime
0 2018-04-01
1 2019-05-01

ceil

df['datetime'] = df['datetime'].dt.ceil("D")
print(df)

 結果

    datetime
0 2018-04-02
1 2019-05-02

まとめ

 pandasでは、時間軸でデータを抽出したりといったことが非常に多いですが、秒やミリ秒まで含まれていると扱いづらいことも多いです。困ったときに是非活用してみてください。