LoginSignup
1
1

More than 5 years have passed since last update.

不連続の時系列データに対して、直前の値を補間して連続データに変換

Last updated at Posted at 2018-04-25

後輩に向けて不連続の時系列データに対して、直前の値を補間して連続データに直す手順例

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

直前の値で補間されたデータの完成。ぱちぱち。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1