如何将日期转为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
相关产品推荐
相关产品推荐

