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

按datetime列A分组,为C列计算3期Simple Moving Average生成新列df['D']

实现按Datetime分组后计算C列的3期简单移动平均(SMA)

我来帮你搞定这个需求!要给你的DataFrame新增一列D,存储按datetime列A分组后C列的3期简单移动平均,其实可以分几步来实现,思路很清晰:

核心思路

  1. 先确保A列是标准的datetime类型(避免分组时出错)
  2. 提取每个唯一datetime分组对应的C值(你的数据里每个分组内C值完全一致,取第一个值即可)
  3. 对提取后的C序列计算3期简单移动平均
  4. 将计算好的移动平均值映射回原DataFrame的对应分组中

完整代码实现

import pandas as pd

# 加载你的原始数据
data = {
    'A': ['2002-01-13 10:00:00', '2002-01-13 10:00:00', '2002-01-13 12:00:00', '2002-01-13 12:00:00',
          '2002-01-18 10:00:00', '2002-01-18 10:00:00', '2002-01-18 12:00:00', '2002-01-18 12:00:00',
          '2002-02-09 08:00:00', '2002-02-09 08:00:00', '2002-02-09 14:00:00', '2002-02-09 14:00:00'],
    'B': ['Jack', 'Hellen', 'Sibl', 'Steve', 'Ridley', 'Scott', 'Rambo', 'Peter', 'Brad', 'Victoria', 'Caroline', 'Andrea'],
    'C': [10, 10, 14, 14, 38, 38, 52, 52, 90, 90, 8, 8]
}
df = pd.DataFrame(data)

# 步骤1:转换A列为datetime类型
df['A'] = pd.to_datetime(df['A'])

# 步骤2:提取每个唯一A分组对应的C值(每个分组C值相同,取第一个即可)
grouped_c = df.groupby('A')['C'].first().reset_index()

# 步骤3:计算3期简单移动平均
# window=3表示取3个连续周期,min_periods=1表示不足3期时也计算(若要严格3期则设为3,前两个分组会返回NaN)
grouped_c['D'] = grouped_c['C'].rolling(window=3, min_periods=1).mean()

# 步骤4:将计算好的D值合并回原DataFrame
df = df.merge(grouped_c[['A', 'D']], on='A', how='left')

# 查看最终结果
print(df)

结果说明

运行后你会看到:

  • 前两个分组(2002-01-13 10:00和12:00)的D值分别是10(1期平均)和12((10+14)/2)
  • 第三个分组(2002-01-18 10:00)的D值是(10+14+38)/3≈20.6667
  • 后续分组以此类推,每个分组内的两行数据会共享同一个D值,完全符合需求

内容的提问来源于stack exchange,提问作者Tie_24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:56:49