後輩に向けて不連続の時系列データに対して、直前の値を補間して連続データに直す手順例
Step1 1秒ごとのtimestampをindexにもつdataframeを作る
まずは時間の配列を作成する。
import datetime
import pandas as pd
import numpy as np
# 初期時間
d = datetime.date(2018, 1, 1)
t = datetime.time(0, 0)
base = datetime.datetime.combine(d, t)
# 追加したい秒数
num_sec = 100*60*60 #100日*60分*60秒
datetimes = [base + datetime.timedelta(seconds=x) for x in range(0, num_sec)]
dfという名前で新しい空のdataframeを作成
df = pd.DataFrame(index=datetimes)
dfの中身はこんな感じでindexとして日時だけが入っている。
2018-01-01 00:00:00 |
2018-01-01 00:00:01 |
2018-01-01 00:00:02 |
2018-01-01 00:00:03 |
2018-01-01 00:00:04 |
Step2 ダミーデータの作成
ダミーの生データを作る。(今回の趣旨では重要じゃない)
dummy_type = [0, 1, 256]
# ランダムに数値を振り分け
_arr = np.random.choice(dummy_type, num_sec)
_df = pd.DataFrame(index=datetimes)
_df['A'] = _arr
こんな感じのデータフレームができた。
A | |
---|---|
2018-01-01 00:00:00 | 0 |
2018-01-01 00:00:01 | 256 |
2018-01-01 00:00:02 | 256 |
2018-01-01 00:00:03 | 1 |
2018-01-01 00:00:04 | 1 |
raw_df = _df[_df['A'] != 256]
A | |
---|---|
2018-01-01 00:00:00 | 0 |
2018-01-01 00:00:03 | 1 |
2018-01-01 00:00:04 | 1 |
2018-01-01 00:00:05 | 0 |
2018-01-01 00:00:07 | 1 |
256をもつ行が消えた!ので行がないところは前の値と同じデータとみなすダミーデータが完成!
Step3 dfにraw_dfを入れて、時間が飛んでいるところは直前の値で補間する
空のデータフレームdfと生データのデータフレームraw_dfをくっつける。
df=pd.concat([df, raw_df], axis=1)
A | |
---|---|
2018-01-01 00:00:00 | 0.0 |
2018-01-01 00:00:01 | NaN |
2018-01-01 00:00:02 | NaN |
2018-01-01 00:00:03 | 1.0 |
2018-01-01 00:00:04 | 1.0 |
2018-01-01 00:00:05 | 0.0 |
2018-01-01 00:00:06 | NaN |
2018-01-01 00:00:07 | 1.0 |
2018-01-01 00:00:08 | NaN |
2018-01-01 00:00:09 | 1.0 |
NaNのところがデータのない時間なので、直前の値を補間する。
df = df.ffill()
A | |
---|---|
2018-01-01 00:00:00 | 0.0 |
2018-01-01 00:00:01 | 0.0 |
2018-01-01 00:00:02 | 0.0 |
2018-01-01 00:00:03 | 1.0 |
2018-01-01 00:00:04 | 1.0 |
2018-01-01 00:00:05 | 0.0 |
2018-01-01 00:00:06 | 0.0 |
2018-01-01 00:00:07 | 1.0 |
2018-01-01 00:00:08 | 1.0 |
2018-01-01 00:00:09 | 1.0 |
直前の値で補間されたデータの完成。ぱちぱち。