pandas對時間序列中缺失值進行線性插值

一、問題背景

以二氧化碳濃度數據集爲例,該時間序列在某些時間點上會有缺失值。

# 讀取數據集
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樣條曲線插值(詳情請參考官方文檔)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章