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

如何将日期转为Mon-YY格式并按Time分组求最小最大月份

问题解决:基于Datetime类型分组计算滚动季度起止月份

现有代码背景

我已经通过以下代码创建了包含滚动季度映射的DataFrame:

import pandas as pd
import numpy as np

abcd = pd.DataFrame()
abcd['Month'] = np.nan

abcd['Month'] = pd.date_range(start='2020-04-01', end='2022-04-01', freq = 'MS')

abcd['Time_1'] = np.arange(1, abcd.shape[0]+1)
abcd['Time_2'] = np.arange(0, abcd.shape[0])
abcd['Time_3'] = np.arange(-1, abcd.shape[0]-1)


db_nd_ad_unpivot = pd.melt(abcd, id_vars=['Month'], 
                     value_vars=['Time_1', 'Time_2', 'Time_3'], 
                     var_name='Time_name', value_name='Time')
abcd_map = db_nd_ad_unpivot[(db_nd_ad_unpivot['Time']>0)&(db_nd_ad_unpivot['Time']< abcd.shape[0]+1)]
abcd_map = abcd_map[['Month','Time']]

随后通过以下代码新增了Mon'YY格式的Time_Period列:

abcd_map['Month'] = pd.to_datetime(abcd_map.Month)
abcd_map['Time_Period'] = abcd_map['Month'].apply(lambda x: x.strftime("%b'%y"))

问题描述

现在需要针对每个Time值,获取对应Month列的最小和最大月份并拼接成起始月份-结束月份的格式。但直接对字符串类型的Time_Period分组后,得到的结果不符合预期:

  • 实际分组结果(以Time=17为例):Aug'21-Sept'21
  • 期望结果:Aug'21-Oct'21

问题根源正如推测:不能基于字符串类型的Time_Period计算起止,必须用原始datetime类型的Month列来获取最小、最大值,再格式化输出。

解决代码

直接按Time分组,对Month列取最小和最大值,再统一格式化为目标字符串:

# 按Time分组,计算每个组的最小、最大月份
grouped = abcd_map.groupby('Time')['Month'].agg(['min', 'max'])

# 将日期格式化为Mon'YY格式,并拼接成起止字符串
grouped['Time_Period'] = grouped.apply(
    lambda x: f"{x['min'].strftime('%b\'%y')}-{x['max'].strftime('%b\'%y')}",
    axis=1
)

# 整理成目标格式的DataFrame
result = grouped.reset_index()[['Time', 'Time_Period']]

执行后,以Time=17为例,就能得到期望的Aug'21-Oct'21结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:20:28