按datetime列A分组,为C列计算3期Simple Moving Average生成新列df['D']
实现按Datetime分组后计算C列的3期简单移动平均(SMA)
我来帮你搞定这个需求!要给你的DataFrame新增一列D,存储按datetime列A分组后C列的3期简单移动平均,其实可以分几步来实现,思路很清晰:
核心思路
- 先确保
A列是标准的datetime类型(避免分组时出错) - 提取每个唯一datetime分组对应的
C值(你的数据里每个分组内C值完全一致,取第一个值即可) - 对提取后的
C序列计算3期简单移动平均 - 将计算好的移动平均值映射回原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
相关产品推荐
相关产品推荐

