如何从pandas的Datetime类型列提取年、月、周数据并解决KeyError报错
问题原因
调用groupby(["Week"]).sum()时,分组键Week默认会成为结果DataFrame的索引,不会保留为普通列,所以直接通过df_all_sales['Week']取列会抛出KeyError。
解决方法
方法1:直接从Datetime类型索引提取属性
df_all_sales的索引本身就是datetime64类型的周数据,直接调用索引的时间属性即可:
# 提取年份 df_all_sales['year'] = df_all_sales.index.year # 提取月份 df_all_sales['month'] = df_all_sales.index.month # 提取一年中的第几周 df_all_sales['week_of_year'] = df_all_sales.index.isocalendar().week
方法2:分组时保留Week为普通列
如果希望后续直接把Week当列操作,分组时添加as_index=False参数即可:
# 分组时指定as_index=False,分组键不会转为索引 df_all_sales = df.groupby(["Week"], as_index=False).sum() # 之后就可以正常用dt属性操作Week列 df_all_sales['year'] = df_all_sales['Week'].dt.year df_all_sales['month'] = df_all_sales['Week'].dt.month df_all_sales['week_of_year'] = df_all_sales['Week'].dt.isocalendar().week
方法3:将已有索引重置为普通列
如果已经完成分组不想重新计算,可以调用reset_index()把索引转回普通列:
df_all_sales = df_all_sales.reset_index() # 之后就可以正常取Week列操作 df_all_sales['year'] = df_all_sales['Week'].dt.year
内容的提问来源于stack exchange,提问作者Shreya Adhvaryyu
相关产品推荐
相关产品推荐

