You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:如何从DateTime列生成可聚合的年月组合列

生成可比较的年月分组列并实现按月聚合

首先你的原始数据代码如下:

import numpy as np
import pandas as pd

data = pd.DataFrame({"String_Date" : ['10/12/2021', '9/21/2021', '2/12/2010', '3/25/2009']})
data['Date'] = pd.to_datetime(data["String_Date"])

要实现需求,核心是生成具备时间顺序可比较性、支持groupby聚合的年月列,以下是几种可靠方案:

方案1:使用Period类型列(推荐)

Pandas的Period类型是专门为时间周期设计的,天然支持时间顺序比较,且对groupby聚合非常友好。

# 生成年月周期列,格式为YYYY-MM(如2021-10)
data['Month_Year'] = data['Date'].dt.to_period('M')

生成的列值示例:

String_DateDateMonth_Year
10/12/20212021-10-122021-10
9/21/20212021-09-212021-09
2/12/20102010-02-122010-02
3/25/20092009-03-252009-03

关键特性:

  • 可直接比较时间顺序:data['Month_Year'][1] < data['Month_Year'][0] 返回True(2021-09早于2021-10)
  • 直接用于groupby聚合,比如统计每月数据量:
monthly_stats = data.groupby('Month_Year').size().reset_index(name='Data_Count')
print(monthly_stats)

输出:

Month_Year  Data_Count
0    2009-03           1
1    2010-02           1
2    2021-09           1
3    2021-10           1

方案2:生成带缩写月份的显示列(配合Period列使用)

如果需要类似Oct-21的可视化格式,不要用这个字符串列做比较或聚合(字符串字典序可能和时间顺序冲突,比如Dec-21字符串会大于Jan-22),而是单独生成显示用列,聚合仍用Period列:

# 生成缩写月份+两位年份的显示列
data['Month_Year_Display'] = data['Date'].dt.strftime('%b-%y')

生成的列值示例:

String_DateDateMonth_YearMonth_Year_Display
10/12/20212021-10-122021-10Oct-21
9/21/20212021-09-212021-09Sep-21
2/12/20102010-02-122010-02Feb-10
3/25/20092009-03-252009-03Mar-09

方案3:YYYY-MM格式字符串列(兼容比较和聚合)

如果坚持用字符串列且要保证可比较,用YYYY-MM格式的字符串,它的字典序和时间顺序完全一致:

data['Month_Year_String'] = data['Date'].dt.strftime('%Y-%m')

这种格式的字符串可以直接比较('2021-09' < '2021-10'返回True),也能用于groupby,但性能和易用性不如Period类型。


内容的提问来源于stack exchange,提问作者user603535

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:40:31