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

如何对Pandas DataFrame按年份每两月分组并保留时间排序能力

解决方案

你可以直接通过数值计算生成双月编号,天然支持排序,无需手动写映射字典,逻辑更简洁通用:

方法1:直接计算双月编号(推荐)

通过整数运算得到数值型双月标识,排序、分组都更方便,也可以随时转成你需要的「1-2」这类区间展示格式:

import pandas as pd
# 示例DataFrame
df = pd.DataFrame({'year' : [2020, 2020, 2021, 2021], 
               'month': [1, 2, 3, 4],
               'score': [10,20,30,40]})
# 计算数值型双月编号,1-2月对应1、3-4月对应2,以此类推,天然支持排序
df['bi_month_idx'] = (df['month'] - 1) // 2 + 1
# 按需生成区间展示字段
df['bi_month_range'] = df['bi_month_idx'].apply(lambda x: f"{2*x-1}-{2*x}")
# 分组聚合,结果默认按年份、双月顺序排序
res = df.groupby(['year', 'bi_month_idx', 'bi_month_range'], as_index=False)['score'].mean()
# 不需要编号字段可直接删除
res = res.drop('bi_month_idx', axis=1)

方法2:基于datetime重采样

如果你的场景已经在使用datetime类型字段,可以直接用pandas重采样的双月频率实现:

# 生成年月日期字段
df['date'] = pd.to_datetime(df[['year', 'month']].assign(day=1))
# 按双月频率重采样求均值
res = df.set_index('date').resample('2M', closed='left')['score'].mean().reset_index()
# 提取年份和双月区间
res['year'] = res['date'].dt.year
res['bi_month_range'] = res['date'].dt.month.apply(lambda x: f"{x}-{x+1}")

两种方法都不需要手动维护月份映射字典,也不存在排序问题,其中方法1计算更轻量,适配性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:36:00