pandas對時間序列中缺失值進行線性插值
阿新 • • 發佈:2022-05-23
一、問題背景
以二氧化碳濃度資料集為例,該時間序列在某些時間點上會有缺失值。
# 讀取資料集
df = pd.read_csv('二氧化碳濃度.csv')
# 將欄位Datetime資料型別轉換為日期型別
df['datetime'] = pd.to_datetime(df['datetime'], format="%Y-%m-%d %H:%M:%S")
df
value | datetime | |
---|---|---|
0 | 370 | 2022-04-13 00:11:00 |
1 | 375 | 2022-04-13 00:42:00 |
2 | 383 | 2022-04-13 01:11:00 |
3 | 391 | 2022-04-13 01:41:00 |
4 | 397 | 2022-04-13 02:11:00 |
... | ... | ... |
583 | 369 | 2022-04-23 22:12:00 |
584 | 376 | 2022-04-23 22:41:00 |
585 | 379 | 2022-04-23 23:11:00 |
586 | 379 | 2022-04-23 23:12:00 |
587 | 378 | 2022-04-23 23:41:00 |
588 rows × 2 columns
該資料集是沒個半小時一條資料,若想要填充成10分鐘一條資料,就需要進行線性插值。
二、pandas解決方案
下面我們需要生成一個輔助dataframe,命名為helper, 包含所有日期。
# pd.date_range時間序列 # 間隔十分鐘 helper = pd.DataFrame({'datetime': pd.date_range(start=df['datetime'].min(), end=df['datetime'].max(),freq='600s')}) # helper = pd.DataFrame(helper).set_index('datetime')#將時間列變為索引
helper:
datetime | |
---|---|
0 | 2022-04-13 00:11:00 |
1 | 2022-04-13 00:21:00 |
2 | 2022-04-13 00:31:00 |
3 | 2022-04-13 00:41:00 |
4 | 2022-04-13 00:51:00 |
... | ... |
1577 | 2022-04-23 23:01:00 |
1578 | 2022-04-23 23:11:00 |
1579 | 2022-04-23 23:21:00 |
1580 | 2022-04-23 23:31:00 |
1581 | 2022-04-23 23:41:00 |
1582 rows × 1 columns
然後再將helper和d join起來
d = pd.merge(df, helper, on='datetime', how='outer').sort_values('datetime')
最後一步就是插值了,直接用interpolate方法,method選擇linear,線性插值。
d['value'] = d['value'].interpolate(method='linear')
value | datetime | |
---|---|---|
0 | 370.0 | 2022-04-13 00:11:00 |
588 | NaN | 2022-04-13 00:21:00 |
589 | NaN | 2022-04-13 00:31:00 |
590 | NaN | 2022-04-13 00:41:00 |
1 | 375.0 | 2022-04-13 00:42:00 |
... | ... | ... |
585 | 379.0 | 2022-04-23 23:11:00 |
586 | 379.0 | 2022-04-23 23:12:00 |
1658 | NaN | 2022-04-23 23:21:00 |
1659 | NaN | 2022-04-23 23:31:00 |
587 | 378.0 | 2022-04-23 23:41:00 |
1660 rows × 2 columns
插值選擇方法不止有線性,還可以是
- nearest:最鄰近插值法
- zero:階梯插值
- slinear、linear:線性插值
- quadratic、cubic:2、3階B樣條曲線插值(詳情請參考官方文件)