pandasで時系列カラムの欠損行を埋める

ログデータから計測時間を元にgroupbyして集約データにするときに、 広告のクリックのように滅多に計測できないものの場合は その時間帯の行が無いことがある。

具体的にはこんな内容のデータ。

     click          created_at
1       1 2017-07-01 01:00:00
2       1 2017-07-01 02:00:00
3       2 2017-07-01 03:00:00
4       2 2017-07-01 04:00:00
5       2 2017-07-01 07:00:00
6       3 2017-07-01 08:00:00
7       2 2017-07-01 09:00:00
8       1 2017-07-01 10:00:00
9       1 2017-07-01 11:00:00
10      1 2017-07-01 12:00:00

5,6時の行がない。

date_range関数でSeriesオブジェクトを生成して、

indexを設定し直すことで行を埋めることができる。

事前にindexをcreated_at列に置き換えておく。

sample_log.index = sample_log.created_at
start_at, end_at = sample_log.created_at.min(), sample_log.created_at.max()
res = sample_log.reindex(pd.date_range(start_at, end_at, freq="H"))

print("[after]\n",res.head(10))

5,6時の行が増えた。click, created_at には値はなかったので

それぞれNaN, NaTとなっている。(datetime だから Not Available Time?)

[after]
                      click          created_at
2017-07-01 01:00:00    1.0 2017-07-01 01:00:00
2017-07-01 02:00:00    1.0 2017-07-01 02:00:00
2017-07-01 03:00:00    2.0 2017-07-01 03:00:00
2017-07-01 04:00:00    2.0 2017-07-01 04:00:00
2017-07-01 05:00:00    NaN                 NaT
2017-07-01 06:00:00    NaN                 NaT
2017-07-01 07:00:00    2.0 2017-07-01 07:00:00
2017-07-01 08:00:00    3.0 2017-07-01 08:00:00
2017-07-01 09:00:00    2.0 2017-07-01 09:00:00
2017-07-01 10:00:00    1.0 2017-07-01 10:00:00

ついでにカラムの欠損を埋めるとしたら

今度は逆にindexをcreated_atに上書きする。

clickはfillna関数を使って埋める。

res.created_at = res.index
res.click = res.click.fillna(0)

print("[after2]\n",res.head(10))

終結

[after2]
                      click          created_at
2017-07-01 01:00:00    1.0 2017-07-01 01:00:00
2017-07-01 02:00:00    1.0 2017-07-01 02:00:00
2017-07-01 03:00:00    2.0 2017-07-01 03:00:00
2017-07-01 04:00:00    2.0 2017-07-01 04:00:00
2017-07-01 05:00:00    0.0 2017-07-01 05:00:00
2017-07-01 06:00:00    0.0 2017-07-01 06:00:00
2017-07-01 07:00:00    2.0 2017-07-01 07:00:00
2017-07-01 08:00:00    3.0 2017-07-01 08:00:00
2017-07-01 09:00:00    2.0 2017-07-01 09:00:00
2017-07-01 10:00:00    1.0 2017-07-01 10:00:00

参考

pandas.date_range — pandas 0.20.3 documentation

pandas.DataFrame.reindex — pandas 0.20.3 documentation

pandas.DataFrame.fillna — pandas 0.20.3 documentation