熊猫在索引级别内重采样频率

时间:2020-02-26 13:32:34

标签: pandas python-datetime sample-data

在Pandas内,我想对我的数据框进行重新采样,并在5小时内和指数水平内取平均值。我的数据框看起来像:df

            timestamp       width  length
name                                    
10    2019-08-01 00:00:00   10.1    86.1
10    2019-08-01 00:00:10   10.0    86.2
10    2019-08-01 00:05:40   10.1    86.3
10    2019-08-01 00:05:50   10.0    86.2
8     2019-08-01 00:05:54   12.0   110.0

我想将我的'name'变量保留为索引(最好不将时间戳记设置为索引),例如:

            timestamp       width  length
name                                    
10    2019-08-01 00:00:05   10.05   86.15
10    2019-08-01 00:05:45   10.05   86.25
8     2019-08-01 00:05:54   12.0    110.0

我尝试过:

df_resample = df.resample('5H', on='timestamp').mean()

但这不会在索引级别执行。还会在我要避免的索引上设置日期时间。

2 个答案:

答案 0 :(得分:1)

IIUC,您可以使用groupbyresample

(df.groupby(level=0, sort=False)
   .resample('5min', on='timestamp').mean()
   .reset_index()
)

但是,这不能使您的时间戳平均,因为虽然有很多方法可以解决,但您无法真正在熊猫中添加Datetime类型。

   name           timestamp  width  length
0    10 2019-08-01 00:00:00  10.05   86.15
1    10 2019-08-01 00:05:00  10.05   86.25
2     8 2019-08-01 00:05:00  12.00  110.00

更新如果您想要平均时间戳,可以将时间戳临时转换为int,取均值,然后转换回:

(df.assign(int_time=lambda x: x['timestamp'].astype('int64') )
   .groupby(level=0, sort=False)
   .resample('5min', on='timestamp').mean()
   .reset_index()
   .assign(timestamp=lambda x: x['int_time'].astype('int64').astype('datetime64[ns]'))
   .drop('int_time', axis=1)
)

输出:

   name           timestamp  width  length
0    10 2019-08-01 00:00:05  10.05   86.15
1    10 2019-08-01 00:05:45  10.05   86.25
2     8 2019-08-01 00:05:54  12.00  110.00

答案 1 :(得分:0)

将时间戳临时设置为索引,然后重新建立原始索引。

df = df.reset_index().set_index('timestamp').resample('5H').mean().set_index('name')

这是您想要获得的吗?