基于pandas统计DataFrame日期滚动窗口指定列唯一值并新增列
Pandas 固定时间窗口统计字段唯一值实现方案
核心需求梳理
- 固定统计基准日期:2022年10月15日
- 统计规则:分别计算基准日期往前7天、30天、60天三个时间窗口内,
dealer(经销商)列的去重计数 - 输出要求:将三个窗口的统计结果作为新字段追加到原DataFrame中
具体实现代码
前置处理
第一步必须先把日期列转换为Pandas标准时间格式,否则时间范围过滤会出错:
import pandas as pd # 转换日期列格式 df['date'] = pd.to_datetime(df['date']) # 定义基准日期 base_date = pd.to_datetime('2022-10-15')
固定基准日窗口统计
因为是固定基准日期的全局统计,计算结果为固定值,直接过滤时间范围后计算唯一值数量,赋值给新列即可:
# 近7天唯一经销商数,边界可根据业务调整:如果不含基准日当天,把 <= 改为 < df['dealer_cnt_7d'] = df.loc[ (df['date'] >= base_date - pd.Timedelta(days=7)) & (df['date'] <= base_date), 'dealer' ].nunique() # 近30天唯一经销商数 df['dealer_cnt_30d'] = df.loc[ (df['date'] >= base_date - pd.Timedelta(days=30)) & (df['date'] <= base_date), 'dealer' ].nunique() # 近60天唯一经销商数 df['dealer_cnt_60d'] = df.loc[ (df['date'] >= base_date - pd.Timedelta(days=60)) & (df['date'] <= base_date), 'dealer' ].nunique()
运行后三个新列会自动填充到所有行,和预期输出效果一致。
扩展场景适配
如果业务需求变更为逐行以当前行的日期为基准,统计每行往前N天的唯一经销商数,可以使用时间滚动窗口实现:
# 将日期设为索引并按时间升序排序 df = df.set_index('date').sort_index() # 批量计算三个窗口的统计值 for window_days in [7, 30, 60]: df[f'dealer_cnt_{window_days}d'] = df['dealer'].rolling( window=f'{window_days}D', closed='left' # 窗口边界规则:left表示不含当日,right表示含当日,按业务需求调整 ).apply(lambda x: x.nunique()) # 重置索引还原原表结构 df = df.reset_index()
注意事项:如果需要按区域、门店等其他维度分组统计窗口内的唯一经销商数,只需要在过滤/滚动逻辑前增加
groupby对应维度字段即可。
内容的提问来源于stack exchange,提问作者niko
相关产品推荐
相关产品推荐

