補齊時間序列
Table of Contents
時間索引缺失如何補齊?
需要補齊的時間序列不是索引?
處理數據時我們總會遇到令人頭疼的時間序列,一方面我們遇到看着是時間又不是時間格式的數據需要我們將其轉化為時間格式。另一方面就是這次討論的時間序列缺失的問題。
處理時間格式
准備我們的數據:
數據地址
import numpy as np
import pandas as pd
時間索引缺失如何補齊?
# 數據可以自行下載
file = r'timeseries.csv'
df = pd.read_csv(file, index_col=0)
df
A B C D
2019/10/11 0:00 28 14 25 15
2019/10/11 1:00 11 11 14 26
2019/10/11 3:00 15 12 14 17
2019/10/11 4:00 16 10 14 12
2019/10/11 6:00 24 11 13 26
2019/10/11 8:00 21 29 29 22
2019/10/11 9:00 18 18 17 25
明顯時間索引有缺失的情況,我們可以使用reindex()來處理:
確保索引是時間格式
得到完整的時間序列
reindex補齊
為什么要確保時間格式?我們生成的序列要保證時間完整只能使用時間格式,除非自己手動實現復雜的算法。reindex要求兩者數據一致,否則你會得到全NAN數據。
df.index
Index(['2019/10/11 0:00', '2019/10/11 1:00', '2019/10/11 3:00',
'2019/10/11 4:00', '2019/10/11 6:00', '2019/10/11 8:00',
'2019/10/11 9:00'],
dtype='object')
# 創建完整的時間格式
t_index = pd.date_range('2019-10-11 00:00:00', '2019-10-11 09:00:00', freq='H')
df.reindex(t_index)
A B C D
2019-10-11 00:00:00 NaN NaN NaN NaN
2019-10-11 01:00:00 NaN NaN NaN NaN
2019-10-11 02:00:00 NaN NaN NaN NaN
2019-10-11 03:00:00 NaN NaN NaN NaN
2019-10-11 04:00:00 NaN NaN NaN NaN
2019-10-11 05:00:00 NaN NaN NaN NaN
2019-10-11 06:00:00 NaN NaN NaN NaN
2019-10-11 07:00:00 NaN NaN NaN NaN
2019-10-11 08:00:00 NaN NaN NaN NaN
2019-10-11 09:00:00 NaN NaN NaN NaN
由於CSV文本文件,我們也看到數據類型不對的情況下,全NaN的結果。
重新獲取數據,並實現時間格式解析
df = pd.read_csv(file, parse_dates=[0], index_col=0)
df
A B C D
2019-10-11 00:00:00 28 14 25 15
2019-10-11 01:00:00 11 11 14 26
2019-10-11 03:00:00 15 12 14 17
2019-10-11 04:00:00 16 10 14 12
2019-10-11 06:00:00 24 11 13 26
2019-10-11 08:00:00 21 29 29 22
2019-10-11 09:00:00 18 18 17 25
df.index # 解析成時間格式了
DatetimeIndex(['2019-10-11 00:00:00', '2019-10-11 01:00:00',
'2019-10-11 03:00:00', '2019-10-11 04:00:00',
'2019-10-11 06:00:00', '2019-10-11 08:00:00',
'2019-10-11 09:00:00'],
dtype='datetime64[ns]', freq=None)
使用完整的時間reindex
df.reindex(t_index)
A B C D
2019-10-11 00:00:00 28.0 14.0 25.0 15.0
2019-10-11 01:00:00 11.0 11.0 14.0 26.0
2019-10-11 02:00:00 NaN NaN NaN NaN
2019-10-11 03:00:00 15.0 12.0 14.0 17.0
2019-10-11 04:00:00 16.0 10.0 14.0 12.0
2019-10-11 05:00:00 NaN NaN NaN NaN
2019-10-11 06:00:00 24.0 11.0 13.0 26.0
2019-10-11 07:00:00 NaN NaN NaN NaN
2019-10-11 08:00:00 21.0 29.0 29.0 22.0
2019-10-11 09:00:00 18.0 18.0 17.0 25.0
df.reindex(t_index, fill_value=0) # 使用0填充缺失值
A B C D
2019-10-11 00:00:00 28 14 25 15
2019-10-11 01:00:00 11 11 14 26
2019-10-11 02:00:00 0 0 0 0
2019-10-11 03:00:00 15 12 14 17
2019-10-11 04:00:00 16 10 14 12
2019-10-11 05:00:00 0 0 0 0
2019-10-11 06:00:00 24 11 13 26
2019-10-11 07:00:00 0 0 0 0
2019-10-11 08:00:00 21 29 29 22
2019-10-11 09:00:00 18 18 17 25
需要補齊的時間序列不是索引?
我們無法保證所有的情況都是使用時間格式作為索引的,那么在這樣的情況下我們應該怎么辦?
df = pd.read_csv(file, parse_dates=[0], names=list('TABCD'), skiprows=[0])
df鄭州做人流多少錢 http://www.gz020zj.com/
T A B C D
0 2019-10-11 00:00:00 28 14 25 15
1 2019-10-11 01:00:00 11 11 14 26
2 2019-10-11 03:00:00 15 12 14 17
3 2019-10-11 04:00:00 16 10 14 12
4 2019-10-11 06:00:00 24 11 13 26
5 2019-10-11 08:00:00 21 29 29 22
6 2019-10-11 09:00:00 18 18 17 25
我們手動將時間列命名成"T"
我們可以使用merge()實現:
# 創建一個待混合的數據幀
T_df = pd.DataFrame(t_index, columns=['T'])
T_df
T
0 2019-10-11 00:00:00
1 2019-10-11 01:00:00
2 2019-10-11 02:00:00
3 2019-10-11 03:00:00
4 2019-10-11 04:00:00
5 2019-10-11 05:00:00
6 2019-10-11 06:00:00
7 2019-10-11 07:00:00
8 2019-10-11 08:00:00
9 2019-10-11 09:00:00
df.merge(T_df, how='right', sort=True)
T A B C D
0 2019-10-11 00:00:00 28.0 14.0 25.0 15.0
1 2019-10-11 01:00:00 11.0 11.0 14.0 26.0
2 2019-10-11 02:00:00 NaN NaN NaN NaN
3 2019-10-11 03:00:00 15.0 12.0 14.0 17.0
4 2019-10-11 04:00:00 16.0 10.0 14.0 12.0
5 2019-10-11 05:00:00 NaN NaN NaN NaN
6 2019-10-11 06:00:00 24.0 11.0 13.0 26.0
7 2019-10-11 07:00:00 NaN NaN NaN NaN
8 2019-10-11 08:00:00 21.0 29.0 29.0 22.0
9 2019-10-11 09:00:00 18.0 18.0 17.0 25.0
使用merge的注意點:
merge(right), 中right:T_df必須是數據幀(DataFrame),而且列名保持一致
sort=True: 保證時間序列的正確