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_Date | Date | Month_Year |
|---|---|---|
| 10/12/2021 | 2021-10-12 | 2021-10 |
| 9/21/2021 | 2021-09-21 | 2021-09 |
| 2/12/2010 | 2010-02-12 | 2010-02 |
| 3/25/2009 | 2009-03-25 | 2009-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_Date | Date | Month_Year | Month_Year_Display |
|---|---|---|---|
| 10/12/2021 | 2021-10-12 | 2021-10 | Oct-21 |
| 9/21/2021 | 2021-09-21 | 2021-09 | Sep-21 |
| 2/12/2010 | 2010-02-12 | 2010-02 | Feb-10 |
| 3/25/2009 | 2009-03-25 | 2009-03 | Mar-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
相关产品推荐
相关产品推荐

