在 Pandas 中重新采样并进行线性插值
Resampling and doing Linear Interpolation in Pandas
我有一个包含 Id, DateTime and Value
列的数据。数据应该每 10 分钟收集一次。但是,有些数据的间隔超过 10 分钟(例如超过 20 分钟、1 小时、2 小时的间隔)。收集整整一个月的数据。我想在我的 Value Column
上使用重新采样并使用线性插值,以便每个 Value columns
包含固定时间间隔的数据(比如每 1 小时和(每周))。
这是我的示例数据
Id DateTime Value
20 2018-04-08 00:28:52 10
20 2018-04-08 00:38:34 11
20 2018-04-08 00:48:57 9
20 2018-04-08 01:18:22 7
............................
205 2018-04-08 01:08:28 11
205 2018-04-08 01:18:33 13
205 2018-04-08 01:27:22 8
205 2018-04-08 01:37:02 7
205 2018-04-08 01:56:44 6
205 2018-04-08 02:16:14 10
.....
2053 2018-04-08 02:06:03 11
2053 2018-04-08 02:17:10 12
2053 2018-04-08 02:26:33 8
2053 2018-04-08 02:36:53 9
2053 2018-04-08 03:26:33 13
有什么建议吗?
谢谢
我认为需要:
print (df)
Id DateTime Value
0 20 2018-04-08 00:28:52 10
1 20 2018-04-08 00:38:34 11
2 20 2018-04-08 00:48:57 9
3 20 2018-04-08 01:18:22 7
4 205 2018-04-08 01:08:28 11
5 205 2018-04-08 01:18:33 13
6 205 2018-04-08 01:27:22 8
7 205 2018-04-08 01:37:02 7
8 205 2018-04-08 01:56:44 6
9 205 2018-04-08 02:16:14 10
10 2053 2018-04-08 10:06:03 11
11 2053 2018-04-08 10:17:10 12
12 2053 2018-04-08 10:26:33 8
13 2053 2018-04-08 10:36:53 9
14 2053 2018-04-08 10:26:33 13
df = df.set_index('DateTime')['Value'].resample('1H').mean().interpolate()
print (df)
DateTime
2018-04-08 00:00:00 10.000000
2018-04-08 01:00:00 8.666667
2018-04-08 02:00:00 10.000000
2018-04-08 03:00:00 10.075000
2018-04-08 04:00:00 10.150000
2018-04-08 05:00:00 10.225000
2018-04-08 06:00:00 10.300000
2018-04-08 07:00:00 10.375000
2018-04-08 08:00:00 10.450000
2018-04-08 09:00:00 10.525000
2018-04-08 10:00:00 10.600000
Freq: H, Name: Value, dtype: float64
编辑:
如果需要每个组 resample
也添加 groupby
和 reindex
对于相同的 DatetimeIndex
每个唯一 Id
s:
df = df.set_index('DateTime').groupby('Id')['Value'].resample('1H').mean()
mux = pd.MultiIndex.from_product([df.index.levels[0], pd.date_range(df.index.levels[1].min(), df.index.levels[1].max(), freq='h')])
df = df.reindex(mux)
df = df.groupby(level=0).apply(lambda x: x.interpolate())
print (df)
20 2018-04-08 00:00:00 10.0
2018-04-08 01:00:00 7.0
2018-04-08 02:00:00 7.0
2018-04-08 03:00:00 7.0
2018-04-08 04:00:00 7.0
2018-04-08 05:00:00 7.0
2018-04-08 06:00:00 7.0
2018-04-08 07:00:00 7.0
2018-04-08 08:00:00 7.0
2018-04-08 09:00:00 7.0
2018-04-08 10:00:00 7.0
205 2018-04-08 00:00:00 NaN
2018-04-08 01:00:00 9.0
2018-04-08 02:00:00 10.0
2018-04-08 03:00:00 10.0
2018-04-08 04:00:00 10.0
2018-04-08 05:00:00 10.0
2018-04-08 06:00:00 10.0
2018-04-08 07:00:00 10.0
2018-04-08 08:00:00 10.0
2018-04-08 09:00:00 10.0
2018-04-08 10:00:00 10.0
2053 2018-04-08 00:00:00 NaN
2018-04-08 01:00:00 NaN
2018-04-08 02:00:00 NaN
...
2018-04-08 07:00:00 NaN
2018-04-08 08:00:00 NaN
2018-04-08 09:00:00 NaN
2018-04-08 10:00:00 10.6
Name: Value, dtype: float64
另一种解决方案,如果需要 interpolate
每组分开:
df = (df.set_index('DateTime')
.groupby('Id')['Value']
.resample('1H')
.mean()
.groupby(level=0)
.apply(lambda x: x.interpolate()))
print (df)
Id DateTime
20 2018-04-08 00:00:00 10.0
2018-04-08 01:00:00 7.0
205 2018-04-08 01:00:00 9.0
2018-04-08 02:00:00 10.0
2053 2018-04-08 10:00:00 10.6
Name: Value, dtype: float64
我有一个包含 Id, DateTime and Value
列的数据。数据应该每 10 分钟收集一次。但是,有些数据的间隔超过 10 分钟(例如超过 20 分钟、1 小时、2 小时的间隔)。收集整整一个月的数据。我想在我的 Value Column
上使用重新采样并使用线性插值,以便每个 Value columns
包含固定时间间隔的数据(比如每 1 小时和(每周))。
这是我的示例数据
Id DateTime Value
20 2018-04-08 00:28:52 10
20 2018-04-08 00:38:34 11
20 2018-04-08 00:48:57 9
20 2018-04-08 01:18:22 7
............................
205 2018-04-08 01:08:28 11
205 2018-04-08 01:18:33 13
205 2018-04-08 01:27:22 8
205 2018-04-08 01:37:02 7
205 2018-04-08 01:56:44 6
205 2018-04-08 02:16:14 10
.....
2053 2018-04-08 02:06:03 11
2053 2018-04-08 02:17:10 12
2053 2018-04-08 02:26:33 8
2053 2018-04-08 02:36:53 9
2053 2018-04-08 03:26:33 13
有什么建议吗? 谢谢
我认为需要:
print (df)
Id DateTime Value
0 20 2018-04-08 00:28:52 10
1 20 2018-04-08 00:38:34 11
2 20 2018-04-08 00:48:57 9
3 20 2018-04-08 01:18:22 7
4 205 2018-04-08 01:08:28 11
5 205 2018-04-08 01:18:33 13
6 205 2018-04-08 01:27:22 8
7 205 2018-04-08 01:37:02 7
8 205 2018-04-08 01:56:44 6
9 205 2018-04-08 02:16:14 10
10 2053 2018-04-08 10:06:03 11
11 2053 2018-04-08 10:17:10 12
12 2053 2018-04-08 10:26:33 8
13 2053 2018-04-08 10:36:53 9
14 2053 2018-04-08 10:26:33 13
df = df.set_index('DateTime')['Value'].resample('1H').mean().interpolate()
print (df)
DateTime
2018-04-08 00:00:00 10.000000
2018-04-08 01:00:00 8.666667
2018-04-08 02:00:00 10.000000
2018-04-08 03:00:00 10.075000
2018-04-08 04:00:00 10.150000
2018-04-08 05:00:00 10.225000
2018-04-08 06:00:00 10.300000
2018-04-08 07:00:00 10.375000
2018-04-08 08:00:00 10.450000
2018-04-08 09:00:00 10.525000
2018-04-08 10:00:00 10.600000
Freq: H, Name: Value, dtype: float64
编辑:
如果需要每个组 resample
也添加 groupby
和 reindex
对于相同的 DatetimeIndex
每个唯一 Id
s:
df = df.set_index('DateTime').groupby('Id')['Value'].resample('1H').mean()
mux = pd.MultiIndex.from_product([df.index.levels[0], pd.date_range(df.index.levels[1].min(), df.index.levels[1].max(), freq='h')])
df = df.reindex(mux)
df = df.groupby(level=0).apply(lambda x: x.interpolate())
print (df)
20 2018-04-08 00:00:00 10.0
2018-04-08 01:00:00 7.0
2018-04-08 02:00:00 7.0
2018-04-08 03:00:00 7.0
2018-04-08 04:00:00 7.0
2018-04-08 05:00:00 7.0
2018-04-08 06:00:00 7.0
2018-04-08 07:00:00 7.0
2018-04-08 08:00:00 7.0
2018-04-08 09:00:00 7.0
2018-04-08 10:00:00 7.0
205 2018-04-08 00:00:00 NaN
2018-04-08 01:00:00 9.0
2018-04-08 02:00:00 10.0
2018-04-08 03:00:00 10.0
2018-04-08 04:00:00 10.0
2018-04-08 05:00:00 10.0
2018-04-08 06:00:00 10.0
2018-04-08 07:00:00 10.0
2018-04-08 08:00:00 10.0
2018-04-08 09:00:00 10.0
2018-04-08 10:00:00 10.0
2053 2018-04-08 00:00:00 NaN
2018-04-08 01:00:00 NaN
2018-04-08 02:00:00 NaN
...
2018-04-08 07:00:00 NaN
2018-04-08 08:00:00 NaN
2018-04-08 09:00:00 NaN
2018-04-08 10:00:00 10.6
Name: Value, dtype: float64
另一种解决方案,如果需要 interpolate
每组分开:
df = (df.set_index('DateTime')
.groupby('Id')['Value']
.resample('1H')
.mean()
.groupby(level=0)
.apply(lambda x: x.interpolate()))
print (df)
Id DateTime
20 2018-04-08 00:00:00 10.0
2018-04-08 01:00:00 7.0
205 2018-04-08 01:00:00 9.0
2018-04-08 02:00:00 10.0
2053 2018-04-08 10:00:00 10.6
Name: Value, dtype: float64