如何在Pandas中从datetime类型日期同时提取年份和月份?
解决Pandas按年月分组分析月度表现的问题
嘿,我完全懂你这个痛点——既要按月份追踪产品表现,又不能把不同年份的同月数据混在一起,单独按年或月分组都满足不了需求对吧?别担心,用Pandas有好几种简单的方法能实现你要的YYYY-MM格式分组,给你详细拆解:
方法1:直接转成年月周期(最推荐)
Pandas的dt.to_period()方法可以直接把datetime列转换成年月周期类型,显示出来就是2018-07这种格式,分组时会自动把同年同月的数据归为一组:
import pandas as pd # 假设你的DataFrame名为df,日期列是'date' df['year_month'] = df['date'].dt.to_period('M') # 按年月分组聚合,比如计算月度销量总和(假设指标列是'sales') monthly_performance = df.groupby('year_month')['sales'].sum().reset_index()
这个方法的好处是保留了时间的周期属性,后续做时间序列分析或排序时会更顺手,不用担心字符串排序出问题。
方法2:拼接年和月字符串(适合需要纯文本格式的场景)
如果你需要的是字符串类型的YYYY-MM,可以提取年份和月份后拼接,记得给月份补零保证格式统一:
# 提取年份转字符串,提取月份转字符串并补零到两位 df['year_month'] = df['date'].dt.year.astype(str) + '-' + df['date'].dt.month.astype(str).str.zfill(2) # 同样进行分组聚合操作 monthly_performance = df.groupby('year_month')['sales'].sum().reset_index()
str.zfill(2)是关键,它能把1-9月的数字转换成01-09,避免出现2018-7这种不规范的格式,保证后续分组和可视化的一致性。
方法3:用strftime格式化日期(最直观的字符串生成法)
直接利用datetime的格式化方法strftime(),指定%Y-%m格式就能得到你想要的结果:
# 格式化日期为YYYY-MM字符串 df['year_month'] = df['date'].dt.strftime('%Y-%m') # 分组聚合 monthly_performance = df.groupby('year_month')['sales'].sum().reset_index()
这个方法最直观,熟悉日期格式化语法的话一眼就能看懂,生成的是标准的文本格式,适合直接用于图表的轴标签。
小提示:制图时的注意事项
不管用哪种方法生成year_month列,制图时直接把它作为x轴即可。如果是用周期类型的列,Pandas和可视化库会自动识别时间顺序;如果是字符串列,只要你的数据是按时间顺序采集的,分组后的结果也会保持正确的顺序,不用担心图表上的年月乱序。
内容的提问来源于stack exchange,提问作者Dasphillipbrau
相关产品推荐
相关产品推荐

