【Python】pandasで数値値データを日時型へ変換する方法

概要

Pythonのpandasにはto_datetimeというメソッドが用意されており文字列型を日時型に一発で変換することができます。

しかし、数値→日時型への変換については数値の型にも気を配らないとエラーが出たため、対処法についてメモしておきます。

サンプルデータ

サンプルデータとして、文字列、数値(int)、数値(float)の三つの型の列を持つデータフレームを用意します。

import pandas as pd
df = pd.DataFrame([['20210101',20210101,20210101.0],['20210102',20210102,20210102.0]], columns=['col1','col2','col3'])
df.dtypes
col1     object
col2      int64
col3    float64
dtype: object

文字列 → 日時型への変換

単にto_datetimeを使用するだけで変換ができます。

pd.to_datetime(df['col1'])
0   2021-01-01
1   2021-01-02
Name: col1, dtype: datetime64[ns]

数値(int) → 日時型への変換

int型から日時型へは直接変換することはできません。以下のようにおかしな値になってしまいます。

NG例

pd.to_datetime(df['col2'])
0   1970-01-01 00:00:00.020210101
1   1970-01-01 00:00:00.020210102
Name: col2, dtype: datetime64[ns]

int型の場合は一旦astype()で文字列型に変換した後にto_datetimeを適用することで変換できます。

OK例

pd.to_datetime(df['col2'].astype(str))
0   2021-01-01
1   2021-01-02
Name: col2, dtype: datetime64[ns]

float型 → 日時型への変換

float型の場合はさらにもうひと手間必要です。例えばfloat型のものを同じようにastypeで文字列型に変換してto_datetimeを適用するとParserErrorを吐いてしまいます。

NG例

pd.to_datetime(df['col3'].astype(str))
ParserError: year 20210101 is out of range: 20210101.0

そのため、float型の場合はint型に変換した上で文字列に変換し、to_datetimeを適用すれば変換することができます。

pd.to_datetime(df['col3'].astype(int).astype(str))
0   2021-01-01
1   2021-01-02
Name: col3, dtype: datetime64[ns]

まとめ

数値型の変換の際はまずはint型に直すということを忘れずに。小数点以下の数字がある場合などはroundなどで丸めてから使用するべき場合もあるかもしれません。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です