Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python・Pandasで日時列から日付と時刻を分離するプログラムの作り方

データ分析では、DataFrame内の日時(datetime)列を「日付」と「時刻」に分けて扱いたい場面がよくあります。たとえば、日ごとの集計を行いたい場合や、時間帯だけを取り出して分析したい場合などが挙げられます。

この記事では、datetime 列を date 列と time 列に分割する方法を、2つのアプローチで解説します。

目標とする出力イメージ

    datetime              date        time
0 2020-01-01 07:10:00  2020-01-01  07:10:00
1 2020-01-02 07:10:00  2020-01-02  07:10:00
2 2020-01-03 07:10:00  2020-01-03  07:10:00
3 2020-01-04 07:10:00  2020-01-04  07:10:00
4 2020-01-05 07:10:00  2020-01-05  07:10:00
5 2020-01-06 07:10:00  2020-01-06  07:10:00

方法1:forループ(リスト内包表記)で分離する

まず、pd.date_range() を使ってサンプル用のDataFrameを作成します。

import pandas as pd

df = pd.DataFrame({'datetime': pd.date_range('2020-01-01 07:10', periods=6)})
print("DataFrame is:\n", df)

次に、df['datetime'] の各要素に対して .date().time() を適用し、結果を新しい列として追加します。リスト内包表記を使うと、各行に対応した値を正しく設定できます。

df['date'] = [d.date() for d in df['datetime']]
df['time'] = [d.time() for d in df['datetime']]
print("Date-time-hour-minutes :\n", df)

実行結果

DataFrame is:
            datetime
0 2020-01-01 07:10:00
1 2020-01-02 07:10:00
2 2020-01-03 07:10:00
3 2020-01-04 07:10:00
4 2020-01-05 07:10:00
5 2020-01-06 07:10:00
Date-time-hour-minutes :
             datetime       date     time
0 2020-01-01 07:10:00 2020-01-01 07:10:00
1 2020-01-02 07:10:00 2020-01-02 07:10:00
2 2020-01-03 07:10:00 2020-01-03 07:10:00
3 2020-01-04 07:10:00 2020-01-04 07:10:00
4 2020-01-05 07:10:00 2020-01-05 07:10:00
5 2020-01-06 07:10:00 2020-01-06 07:10:00

注意ポイント: ループ内で df['date'] = d.date() のように直接代入すると、ループが回るたびに列全体が上書きされ、最終的にすべての行が同じ値になってしまいます。行ごとの値を設定したい場合は、リスト内包表記や .loc を使うのが安全です。

方法2:dtアクセサを使って分離する(推奨)

Pandasでは、pd.to_datetime() で列をdatetime型に変換したうえで、dtアクセサを使うことで、日付や時刻をベクトル化された高速な処理で簡単に取り出せます。

  • pd.to_datetime(df['datetime']).dt.date → 日付部分を抽出し、df['date'] として保存
  • pd.to_datetime(df['datetime']).dt.time → 時刻部分を抽出し、df['time'] として保存

サンプルコード

import pandas as pd

df = pd.DataFrame({'datetime': pd.date_range('2020-01-01 07:10', periods=6)})
print("DataFrame is:\n", df)

df['date'] = pd.to_datetime(df['datetime']).dt.date
df['time'] = pd.to_datetime(df['datetime']).dt.time
print("Date-time-hour-minutes :\n", df)

実行結果

DataFrame is:
            datetime
0 2020-01-01 07:10:00
1 2020-01-02 07:10:00
2 2020-01-03 07:10:00
3 2020-01-04 07:10:00
4 2020-01-05 07:10:00
5 2020-01-06 07:10:00
Date-time-hour-minutes :
             datetime       date     time
0 2020-01-01 07:10:00 2020-01-01 07:10:00
1 2020-01-02 07:10:00 2020-01-02 07:10:00
2 2020-01-03 07:10:00 2020-01-03 07:10:00
3 2020-01-04 07:10:00 2020-01-04 07:10:00
4 2020-01-05 07:10:00 2020-01-05 07:10:00
5 2020-01-06 07:10:00 2020-01-06 07:10:00

なお、対象の列がすでに datetime64 型である場合は、pd.to_datetime() を省略して df['datetime'].dt.date のように直接書くこともできます。

まとめ

日時列から日付と時刻を分離するには、大きく分けて2つの方法があります。

  • 方法1: リスト内包表記で各要素に .date() / .time() を適用する方法。直感的で理解しやすい反面、大量データではやや遅くなります。
  • 方法2: pd.to_datetime()dt アクセサを組み合わせる方法。ベクトル化されているため高速で、実務ではこちらが推奨されます。

データサイズが大きい場合や、前処理パイプラインに組み込む場合は、方法2のdtアクセサを使った書き方を選ぶとよいでしょう。

  1. Pythonの日付と時刻の基本!datetimeモジュールの型・定数・主要メソッドを徹底解説

    Pythonで日付や時刻を操作するには、標準ライブラリのdatetimeモジュールを使用します。このモジュールには、日付・時刻オブジェクトとして「naive(ナイーブ)」と「aware(アウェア)」という2種類のタイプが存在します。 naive(ナイーブ)オブジェクトは、他の日時オブジェクトと明確に区別するために必要な情報(タイムゾーン情報など)を十分に持たないオブジェクトです。UTC(協定世界時)やローカル時刻といった基準を明示的に含まないため、その意味はプログラマー自身が管理する必要があります。 aware(アウェア)オブジェクトは、夏時間(DST)などのアルゴリズム的・政治的な時刻調整

  2. Pythonで日付と時刻の計算を行う方法【timedeltaの使い方を解説】

    Pythonでは、timedeltaオブジェクトを使うことで、日付や時刻の計算を非常に簡単に行えます。日時に時間を加算・減算したい場合は、まずdatetime.datetime()オブジェクトを作成し、そこにdatetime.timedelta()のインスタンスを足したり引いたりするだけです。timedeltaオブジェクトは「期間(duration)」、つまり2つの日付や時刻の差分を表します。timedeltaコンストラクタの関数シグネチャは以下のとおりです。datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, m