按日期聚合小时级PNL数据出错求助:分组后仅返回33条结果
问题原因
你用df.date.dt.day作为分组键,只会提取日期中的“日”部分(1-31),这意味着不同年份、不同月份的同一天会被合并到同一组(比如2018-10-16和2023-10-16会被归为一组),所以最终只会得到最多31个分组结果。
另外,直接将groupby(...).sum()的结果赋值给新列,由于聚合结果的索引是日期的“日”(1-31),而原DataFrame的索引是0到43807的整数,两者不匹配,导致大部分行无法匹配到值,最终只有少量行有结果。
正确解决方案
要按完整的年-月-日分组计算每日总pnl,并将结果映射到原DataFrame的每一行,可用以下方法:
方法1:提取完整日期分组 + transform广播结果
# 提取年-月-日的date对象作为分组键,用transform将聚合结果映射到每一行 df['daily_pnl'] = df.groupby(df['date'].dt.date)['pnl'].transform('sum')
方法2:时间戳向下取整到日 + 分组
# 将小时级时间戳向下取整到当天0点,作为分组键 df['daily_pnl'] = df.groupby(df['date'].dt.floor('D'))['pnl'].transform('sum')
方法3:使用pd.Grouper指定时间频率
适合时间序列数据,灵活性更强:
# 通过Grouper指定按日频率分组 df['daily_pnl'] = df.groupby(pd.Grouper(key='date', freq='D'))['pnl'].transform('sum')
以上三种方法都会给原DataFrame的每一行添加上对应的当日总pnl,比如2018-10-16的所有小时行,daily_pnl列都会显示当天所有pnl的总和。
内容的提问来源于stack exchange,提问作者titn18645t183
相关产品推荐
相关产品推荐

