【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などで丸めてから使用するべき場合もあるかもしれません。