【问题标题】:pandas: rolling mean on time interval plus grouping on index熊猫:时间间隔的滚动平均值加上索引分组
【发布时间】:2020-07-30 04:30:26
【问题描述】:

我正在尝试查找某个类别的一天中小时的 7 天滚动平均值。数据框以类别 id 为索引,并有时间戳加上其他列:

    id   name  ds  time              x    y   z
    6    red   2020-02-14 00:00:00   10   20  30 
    6    red   2020-02-14 01:00:00   20   40  50 
    6    red   2020-02-14 02:00:00   20   20  60 
...
    6    red   2020-02-21 00:00:00   20   30  60 
    6    red   2020-02-21 01:00:00   20   40  60 
    6    red   2020-02-21 02:00:00   10   40  60 
    7    green   2020-02-14 00:00:00   10   20  30 
    7    green   2020-02-14 01:00:00   20   40  50 
    7    green   2020-02-14 02:00:00   20   20  60 
...
    7    green   2020-02-21 00:00:00   20   30  60 
    7    green   2020-02-21 01:00:00   20   40  60 
    7    green   2020-02-21 02:00:00   10   40  60 

我想要什么作为输出(显然滚动列由滚动平均值填充,而不是 NaN):

id   name  ds  time              x    y   z   rolling_x  rolling_y  rolling_z
6    red   2020-02-14 00:00:00   10   20  30    NaN       NaN        NaN
6    red   2020-02-14 01:00:00   20   40  50    NaN       NaN        NaN
6    red   2020-02-14 02:00:00   20   20  60    NaN       NaN        NaN
...
 6    red   2020-02-21 00:00:00   20   30  60    
 6    red   2020-02-21 01:00:00   20   40  60 
 6    red   2020-02-21 02:00:00   10   40  60 
 7    green   2020-02-14 00:00:00   10   20  30  NaN       NaN        NaN
 7    green   2020-02-14 01:00:00   20   40  50  NaN       NaN        NaN
 7    green   2020-02-14 02:00:00   20   20  60  NaN       NaN        NaN

...
 7    green   2020-02-21 00:00:00   20   30  60  
 7    green   2020-02-21 01:00:00   20   40  60 
 7    green   2020-02-21 02:00:00   10   40  60

【问题讨论】:

  • dstime 两列还是一列ds time
  • @QuangHoang 他们是一栏

标签: pandas datetime timestamp time-series aggregate


【解决方案1】:

我的做法:

df = df.assign(day=df['ds time'].dt.normalize(),
               hour=df['ds time'].dt.hour)

ret_df = df.merge(df.drop('ds time', axis=1)
           .set_index('day')
           .groupby(['id','hour']).rolling('7D').mean()
           .drop(['hour','id'], axis=1),
         on=['id','hour','day'],
         how='left',
         suffixes=['','_roll']
        ).drop(['day','hour'], axis=1)

样本数据

dates = pd.date_range('2020-02-21', '2020-02-25', freq='H')

np.random.seed(1)
df = pd.DataFrame({
    'id': np.repeat([6,7], len(dates)),
    'ds time': np.tile(dates,2),
    'X': np.arange(len(dates)*2),
    'Y': np.random.randint(0,10, len(dates)*2)
})
df.head()

输出 ret_df.head():

   id             ds time  X  Y  X_roll  Y_roll
0   6 2020-02-21 00:00:00  0  5     0.0     5.0
1   6 2020-02-21 01:00:00  1  8     1.0     8.0
2   6 2020-02-21 02:00:00  2  9     2.0     9.0
3   6 2020-02-21 03:00:00  3  5     3.0     5.0
4   6 2020-02-21 04:00:00  4  0     4.0     0.0

【讨论】:

  • 这可行,但我如何与原始数据框合并以维护名称?
  • ret_df 应该包含来自df 的所有信息。换句话说,您可以使用df = df.merge(...) 而不是ret_df = df.merge(...)
  • 有效,只需在临时表的.drop 中添加['name'] 即可滚动
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 2015-01-12
  • 2017-08-03
  • 2014-11-17
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多