如何在特定小时的滚动平均值的熊猫数据框中添加一列
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)
【讨论】:
这解决了问题,谢谢!以上是关于如何在特定小时的滚动平均值的熊猫数据框中添加一列的主要内容,如果未能解决你的问题,请参考以下文章