Pandas pivot_table启用margins时datetime字段触发FutureWarning问题
问题解答
1、汇总行date字段显示NaT是否属于预期行为
是完全符合pandas设计逻辑的预期行为。
margins参数生成的全局汇总行,只会对values指定的聚合字段做计算,所有放在index/columns里的维度字段都不会执行聚合运算,统一用占位值填充:字符串/分类类型的维度会用All填充,日期类型的维度无法兼容字符串All,就会用日期类型的专属缺失值NaT(Not a Time,对应数值类型的NaN)填充。
2、为什么margins参数会对日期字段做汇总处理
margins没有针对日期字段做特殊处理,它的底层逻辑是:只要字段被放在透视表的index或columns参数中,生成全局汇总行时就会统一对所有维度生成占位值,和字段类型无关。
你的date字段属于三级索引的最后一级,生成汇总行时前两级Category和Subcategory是字符串类型,所以填充了All,第三级date是日期类型,无法兼容字符串占位值,最终表现为NaT,看起来像是单独对日期做了处理,实际是通用逻辑的差异化表现。
3、上述情况是否就是触发FutureWarning告警的原因
是的,该警告完全由margins生成汇总行的逻辑触发,和你原始数据的date字段类型无关。
触发逻辑是:pandas生成汇总行的索引序列时,前两级索引混入了字符串All,第三级原本是datetime64类型,旧版本pandas会自动尝试将包含字符串的混合类型序列推断回datetime64类型,这个自动推断的行为已经被标记为弃用,因此抛出FutureWarning。
临时解决办法
如果不想看到该警告,可选择以下任意一种方案:
- 升级pandas到1.5.0及以上版本,该问题已经在后续版本中被修复
- 透视前先将date字段转为字符串类型,透视完成后如果需要再转回datetime类型
- 用
warnings.filterwarnings("ignore", category=FutureWarning)临时过滤该类告警(不推荐长期使用)
内容的提问来源于stack exchange,提问作者Ramon
相关产品推荐
相关产品推荐

