如何在特定小时的滚动平均值的熊猫数据框中添加一列

Posted

技术标签:

【中文标题】如何在特定小时的滚动平均值的熊猫数据框中添加一列【英文标题】:how to add a column to a pandas dataframe of the rolling average of specific hour 【发布时间】:2022-01-23 02:23:13 【问题描述】:

我遇到了以下问题:我有一个 pandas 数据框 (df),其中包含 15 分钟时间步长的值,如下所示:

                           value
2018-12-28 01:00:00+01:00       5
2018-12-28 01:15:00+01:00       4
2018-12-28 01:30:00+01:00       2
2018-12-28 01:45:00+01:00       1
2018-12-28 02:00:00+01:00       2
                          ...
2021-12-07 23:45:00+01:00       4
2021-12-08 00:00:00+01:00       3
2021-12-08 00:15:00+01:00       1
2021-12-08 00:30:00+01:00       2
2021-12-08 00:45:00+01:00       2

我想在此数据框中添加一个额外的列,显示上周特定小时内“值”列的平均值。换句话说,对于时间步“2021-12-08 00:15:00+01:00”,我希望此列显示 2021-12 之间 00:15 列“值”中所有值的平均值-01 和 2021-12-07。对此进行建模的最有效方法是什么?

非常感谢!

【问题讨论】:

【参考方案1】:

这不是最漂亮/pythonic 的方式,但它有效:

#Create your df
df=pd.DataFrame(data=[random.randint(0,5) for i in range(2880)], index=pd.date_range('2021-11-08 01:00:00', '2021-12-08 00:45:00', freq='15min'), columns=['value'])

#add extra columns, separating the index in date and time
df['time'] = df.index.time
df['date'] = df.index.date

#creating result, by slicing the dataframe based on 
df['result'] = df.apply(
    lambda row: df.loc[
        (df.date.between(
            row.date - pd.DateOffset(weeks=1), #start = 1 week back
            row.date - pd.DateOffset(days=1) #end is 1 day back
                )
            ) & (df.time == row.time) #get same time
        ].value.mean(), #get mean of value
    axis=1)

【讨论】:

【参考方案2】:

这是一个更快的解决方案,仅适用于日期时间索引:

def get_mean(x):
    date_mask = (df.index >= (x.name - pd.Timedelta('7 days'))) & (df.index < (x.name)) # mask for past 7 days
    past_week_data = df.loc[date_mask] # filter df by mask
    times = past_week_data.at_time(x.name.time()) # filter results for matching times
    return times['value'].mean() #return mean

df['mean'] = df.apply(lambda x: get_mean(x), axis=1)

【讨论】:

这解决了问题,谢谢!

以上是关于如何在特定小时的滚动平均值的熊猫数据框中添加一列的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的数据框中添加一列,说明每行来自哪个工作表名称? Python

在熊猫数据框中查找上一个组的名称

熊猫 - 计算每小时平均滚动 10 分钟

特定列上熊猫的滚动平均值

如何在熊猫数据框中划分时间

使用 numpy.npv 函数的输出向数据框中添加一列