Pandas 熊猫中的重采样和线性插值
我有一个包含Pandas 熊猫中的重采样和线性插值,pandas,dataframe,resampling,Pandas,Dataframe,Resampling,我有一个包含Id、DateTime和Value列的数据。数据应该每10分钟收集一次。但是,有些数据的间隔超过10分钟(例如,间隔超过20分钟、1小时、2小时)。收集了整整一个月的数据。我想在我的值列上使用重新采样和线性插值,以便每个值列包含固定时间间隔的数据(比如每1小时和(每周) 这是我的样本数据 Id DateTime Value 20 2018-04-08 00:28:52 10 20 2018-04-08 00:38:34 11 20
Id、DateTime和Value
列的数据。数据应该每10分钟收集一次。但是,有些数据的间隔超过10分钟(例如,间隔超过20分钟、1小时、2小时)。收集了整整一个月的数据。我想在我的值列
上使用重新采样和线性插值,以便每个值列
包含固定时间间隔的数据(比如每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
编辑: 如果需要对每个组重新采样,还可以为每个唯一的
Id
s添加groupby
for sameDatetimeIndex
:
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())
如果需要,另一种解决方案是分别插入每组:
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
正在重新采样哪些数据?您是否需要
df.set_index('DateTime').resample('1H').mean()
?谢谢,但此重新采样是否独立于Id?可能我需要先使用Id
对groupby
进行分组,然后再对其进行重采样?@user3280146-如果还需要对每个Id进行数据重采样,这并不容易,但如果需要对每个Id
进行相同的日期时间,则需要使用multi-index
重新编制索引,最后对每个组进行插值
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
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