Pandas:如何基于事件列对齐日期列并聚合前后时段数值
解决方法
操作步骤
- 把日期列转成可计算的日期格式,方便后续判断时间区间。
- 定位
event标记为Yes的中心日期,以此作为基准点。 - 分别筛选中心日期前2个月、中心日期本身、后2个月的数据,计算各自的数值平均值。
- 将结果整理成目标DataFrame格式。
代码实现
import pandas as pd # 补全原始数据的字符串引号(原代码存在语法遗漏) df = pd.DataFrame([ ['1/10/12', 'No', 20], ['2/11/12', 'No', 22], ['3/12/12', 'Yes', 29], ['4/14/12', 'No', 30], ['5/14/12', 'No', 31] ], columns=['Time', 'event', 'value'] ) # 1. 转换日期格式,指定格式避免解析歧义 df['Time'] = pd.to_datetime(df['Time'], format='%m/%d/%y') # 2. 获取中心日期(默认取第一个event为Yes的日期) center_date = df[df['event'] == 'Yes']['Time'].iloc[0] # 3. 计算各区间平均值 # 前2个月:日期早于中心,时间差近似不超过2个月 pre_avg = df[(df['Time'] < center_date) & ((center_date - df['Time']).dt.days // 30 <= 2)]['value'].mean() # 中心日期对应数值 center_val = df[df['Time'] == center_date]['value'].iloc[0] # 后2个月:日期晚于中心,时间差近似不超过2个月 post_avg = df[(df['Time'] > center_date) & ((df['Time'] - center_date).dt.days // 30 <= 2)]['value'].mean() # 4. 组装结果DataFrame result_df = pd.DataFrame([ ['pre_center', pre_avg], ['center', center_val], ['post_center', post_avg] ], columns=['Range', 'average_value']) print(result_df)
运行结果
Range average_value 0 pre_center 21.0 1 center 29.0 2 post_center 30.5
补充说明
- 你提供的期望输出中
pre_center和center的数值与实际计算结果不符,上述代码是按照你描述的“前2个月平均值21、后2个月平均值30.5”实现的正确逻辑。 - 若需要更精确的月份判断(比如考虑不同月份的天数差异),可以用
pd.DateOffset计算区间边界:# 精确计算前2个月的起始日期 pre_start = center_date - pd.DateOffset(months=2) pre_avg = df[(df['Time'] >= pre_start) & (df['Time'] < center_date)]['value'].mean() # 精确计算后2个月的结束日期 post_end = center_date + pd.DateOffset(months=2) post_avg = df[(df['Time'] > center_date) & (df['Time'] <= post_end)]['value'].mean() - 如果数据中存在多个
event='Yes'的行,需提前明确处理规则(比如取第一个、最后一个),上述代码默认取第一个匹配的日期。
内容的提问来源于stack exchange,提问作者Salih
相关产品推荐
相关产品推荐

