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

Pandas DataFrame按日期分组时末尾分组被异常合并问题

问题根因

核心错误出在年度最后日期的筛选逻辑上:
groupby的as_index=False参数仅对聚合类操作生效,作用是将分组键从索引转为普通列;在cumcount这类返回与原表等长结果的变换操作中传入该参数,会导致分组计数的索引对齐异常,筛出多余的行,最终生成的分组边界日期列表长度、顺序出错,直接造成末尾分组被错误合并。
此外原代码用str作为自定义变量名,会覆盖Python内置的字符串类型,属于不良编码习惯。

修复方案

修正分组筛选逻辑,去掉干扰结果的as_index=False参数,新增显式排序兜底避免原始数据乱序导致的边界错位:

import pandas as pd

data = {'date':  ['2017-03-31', '2017-04-03', '2017-12-27', '2017-12-28',
                    '2017-12-29', '2018-01-02', '2018-12-31', '2019-01-02',
                    '2019-01-03', '2019-12-31', '2020-12-30', '2020-12-31',
                    '2021-01-20', '2021-12-30', '2021-12-31', '2022-05-30',
                    '2022-05-31'],
        'value': [1163.00, 1221.15, 1318.84, 1384.78,
                    1523.26, 1660.36, 1710.17, 1881.18,
                    1956.43, 2015.12, 2216.64, 2349.63,
                    2373.13, 2562.98, 2819.28, 2875.66,
                    2904.42 ]          
        }
df = pd.DataFrame(data)
# 先将date列转为datetime类型,避免字符串比较的潜在风险
df['date'] = pd.to_datetime(df['date'])
# 按年分组取每年最后一条数据,显式按日期排序兜底
year_end_df = df[df.groupby(df['date'].dt.year).cumcount(ascending=False).eq(0)].sort_values('date')
boundary_dates = year_end_df['date'].dt.strftime('%Y-%m-%d').to_list()
# 插入起始边界日期
boundary_dates.insert(0, '2017-01-01')

# 循环生成各分组
for start, end in zip(boundary_dates, boundary_dates[1:]):
    query_cond = f"'{start}' <= date <= '{end}'"
    print(f"当前分组条件:{query_cond}")
    print(df.query(query_cond), '\n')
结果验证

修复后代码生成的分组条件和预期完全一致:

  • '2017-01-01' <= date <= '2017-12-29'
  • '2017-12-29' <= date <= '2018-12-31'
  • '2018-12-31' <= date <= '2019-12-31'
  • '2019-12-31' <= date <= '2020-12-31'
  • '2020-12-31' <= date <= '2021-12-31'
  • '2021-12-31' <= date <= '2022-05-31'

注:相邻分组共享边界日期的重叠逻辑符合你的设计要求,如果需要避免日期重复归属,可以将前一个分组的结束条件改为<即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:15:54