【Pandas】Excelに日付とシリアル値が混在する場合にDatetimeに統一する方法

Excel から読み込んだときに、日付がバラバラなケースを直したい。

df = pd.read_excel(filename, sheet_name = 'Sheet1') 

pandas の read_excel を使って、Excelファイルを読み込んだとき、日付が、”2020-01-01″のように文字列として読み込まれる時と、”43830″のようにシリアル値として読み込まれる時がある。

文字列とシリアル値が混在したままでは、扱いが難しいため、Datatime 型に統一する方法を下記に書いておく。

import pandas as pd
from datetime import datetime

# データの読み込み (日付が、文字列とシリアル値と混在したケースを想定)
df = pd.DataFrame({'日付': ['2020-01-01', 43830, '2020-01-03', 43832, '2020-01-05']})

# df
# 	日付
# 0	2020-01-01
# 1	43830
# 2	2020-01-03
# 3	43832
# 4	2020-01-05

# 列の型をstrに変更
# astype()は、データ型(dtype)を変更する
df['日付'] = df['日付'].astype(str)

# 日付に'-'を含むものをTrueとする
date_mask = df['日付'].str.contains('-')

# 日付に'-'を含まないもののみを取り出す
# copy()は、データをコピーする
df_excel = df[~date_mask].copy()

# 日付に'-'を含むもの(regularデータ)のみを取り出す
df_reg = df[date_mask].copy()

# regularデータをdatetime型に変換する
df_reg['日付'] = pd.to_datetime(df_reg['日付'])

# excelデータをdatetime型に変換する
df_excel['日付'] = pd.TimedeltaIndex(df_excel['日付'].astype(int), unit='d') + datetime(1900, 1, 1)

# regularデータとexcelデータを結合する
df['日付'] = pd.concat([df_reg['日付'], df_excel['日付']])

# df
# 	日付
# 0	2020-01-01
# 1	2020-01-02
# 2	2020-01-03
# 3	2020-01-04
# 4	2020-01-05