You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:如何基于事件列对齐日期列并聚合前后时段数值

解决方法

操作步骤

  1. 把日期列转成可计算的日期格式,方便后续判断时间区间。
  2. 定位event标记为Yes的中心日期,以此作为基准点。
  3. 分别筛选中心日期前2个月、中心日期本身、后2个月的数据,计算各自的数值平均值。
  4. 将结果整理成目标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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:40:24