如何按6个月间隔而非年度创建Pandas数据透视表?
解决按6个月间隔分组创建透视表的问题
针对你的需求,以下两种常用方法可以实现按6个月(半年)结合年度的自定义时间分组:
方法1:使用pd.Grouper指定时间频率
直接在透视表的index参数中使用pd.Grouper,指定freq='6M'(半年频率),会自动按年度+半年区间完成分组,同时保留时间维度的原生信息。
修改后的代码示例:
# 确保df的索引为datetime类型(你的代码已满足该条件) pivot_df = pd.pivot_table( df, values='Vessel', # 注意:需与你的DataFrame实际列名匹配,原示例列名为Column1/2/3 index=pd.Grouper(freq='6M'), # 按6个月间隔分组 columns='Col1', # 同样需匹配实际列名 aggfunc=pd.Series.nunique )
如果需要更直观的分组标签(如2023H1、2023H2),可分组后手动格式化索引:
pivot_df = pd.pivot_table( df, values='Vessel', index=pd.Grouper(freq='6M'), columns='Col1', aggfunc=pd.Series.nunique ) # 将索引转换为"年份+H1/H2"格式 pivot_df.index = pivot_df.index.to_series().apply(lambda x: f"{x.year}H{'1' if x.month <=6 else '2'}")
方法2:使用dt.to_period('6M')生成分组标签
先从日期索引生成半年周期的标签列,再以此作为分组依据:
# 方式1:生成原生半年周期标签(如2023-01) df['half_year'] = df.index.to_period('6M') # 方式2:自定义"年份+H1/H2"格式标签 df['half_year'] = df.index.year.astype(str) + 'H' + ((df.index.month -1)//6 +1).astype(str) # 基于新列创建透视表 pivot_df = pd.pivot_table( df, values='Vessel', index='half_year', columns='Col1', aggfunc=pd.Series.nunique )
注意事项
- 需确保DataFrame中存在
Vessel和Col1列,若与原示例列名不符,请替换为实际列名 - 若需要自定义半年周期的起始月份(比如从2月开始计算),可在
pd.Grouper中添加origin参数,例:pd.Grouper(freq='6M', origin='2023-02-01')
内容的提问来源于stack exchange,提问作者Canuk688
相关产品推荐
相关产品推荐

