R语言按球队及前7天日期范围对数据框指定列求和
同队前7天数据滚动求和实现方案
前置说明
你的需求核心是按球队分组,对每条记录统计同队在「当前日期前7天(不含当日)」的技术统计求和,注意不要误用「前7场比赛」的固定行数滚动逻辑,必须用时间窗口匹配日期范围要求,避免休赛期/赛程疏密导致的统计错误。
实现代码
import pandas as pd # 1. 基础数据预处理 # 先将Date字段转为日期格式,再按球队、日期升序排序,保证滚动顺序正确 mlb_team_logs['Date'] = pd.to_datetime(mlb_team_logs['Date']) mlb_team_logs = mlb_team_logs.sort_values(by=['Team', 'Date']).reset_index(drop=True) # 2. 提取需要计算滚动和的列(第4列到最后一列,即AB及之后所有统计字段) calc_columns = mlb_team_logs.columns[3:].tolist() # 3. 分组时间窗口滚动计算 l7_summary = ( mlb_team_logs .groupby('Team', group_keys=False) # 窗口为7天,closed='left'表示包含左边界(Date-7)、不包含右边界(当前Date),正好匹配[Date-7, Date-1]的区间要求 .rolling(window='7D', on='Date', closed='left') [calc_columns] .sum() # 统一重命名为l7_开头的字段名 .rename(columns=lambda col_name: f'l7_{col_name}') ) # 4. 合并结果回原表 mlb_team_logs = pd.concat([mlb_team_logs, l7_summary], axis=1)
结果验证说明
用你提供的ARI队样本数据验证:
- 2015-04-13当日的记录,前7天区间为2015-04-06至2015-04-12,共6场比赛
- 这6场的AB值分别为34、31、32、35、32、36,求和为200,对应
l7_AB字段值为200,和代码计算结果一致。
注意事项
- 若某条记录对应的前7天区间内同队无任何比赛,对应l7_字段的求和结果为0,符合统计逻辑
- 该实现基于pandas原生向量化运算,比逐行apply的写法效率高1~2个数量级,即使是全赛季大联盟数据也能秒级出结果
内容的提问来源于stack exchange,提问作者Anthony Amico
相关产品推荐
相关产品推荐

