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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:15:54