pandas DataFrame 中按日期(在索引中)的加权平均分组

Weighted average grouping by date (in index) in pandas DataFrame

我需要一些帮助来尝试根据 datetime-index 和另一个 'mass' 列获取列的加权平均值。 例如:

d = {'date': ['2021-08-01 12:00:00', '2021-08-01 13:00:00', '2021-08-01 14:00:00', '2021-08-02 15:00:00', '2021-08-02 16:00:00', '2021-08-02 17:00:00'], 
     'mass': [23,   40,  10,  12,  15,  11], 
     '%':    [0.4, 0.7, 0.9, 0.1, 0.2, 0.8]
    }
df = pd.DataFrame(data=d)
df.set_index('date')

我需要的是每2小时获取'%'的加权平均值,即'mass'权重列。

我需要这样的输出:

date(index)         | mass |  %
2021-08-01 13:00:00 |  43  | 0.865
2021-08-02 15:00:00 |  22  | 0.464
2021-08-02 17:00:00 |  26  | 0.454

作为加权平均值计算的“%”:

0.865 = ((23 x 0.4) + (40 x 0.7))/ (40 + 23)

请注意,我的索引中可能没有连续的日期时间,例如,我可能会因为缺少数据而跳过几个小时,甚至几天。在那种情况下,如果没有可用于计算的数据,我需要输出为 NaN。 如果只有一行数据,则假设该行是该期间的加权平均值...

经期也可能有所不同,从 2 小时到 12 个月不等...

在上一个问题中,已经有人帮我解决了这个问题:

out = df.assign(k=df['mass'].mul(df['%']))[['mass','k']].sum(level=0)
out['%'] = out.pop('k').div(out['mass'])

不过,这仅在我有重复索引时有效,而这次情况并非如此。

试着每2小时分组一次,你会离得更近-

d = {'date': ['2021-08-01 12:00:00', '2021-08-01 13:00:00', '2021-08-01 14:00:00', '2021-08-02 15:00:00', '2021-08-02 16:00:00', '2021-08-02 17:00:00'], 
     'mass': [23,   40,  10,  12,  15,  11], 
     '%':    [0.4, 0.7, 0.9, 0.1, 0.2, 0.8]
    }
df = pd.DataFrame(data=d)
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')

df['mass_wt'] = df['mass'] * df['%']
op = df.groupby(pd.Grouper(freq='2H')).agg({'mass': 'sum', 'mass_wt': 'sum'}).query('mass > 0')
op['op'] = op['mass_wt'] / op['mass']