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

如何计算pandas累积列差值 按日期统计每日新增住院人数

累计住院数转日新增的实现流程

核心逻辑:同一城市维度下,当日累计住院数减去相邻前一日的累计住院数,即为该城市当日新增,最后按日期汇总所有城市的新增值,得到每日总新增。

第一步:基础数据预处理

  • 统一将日期列转为pandas可识别的时间格式,避免字符串排序带来的顺序错误:
    df['date'] = pd.to_datetime(df['date'])
  • 按城市、日期双维度做升序排序,重置索引保证顺序正确,这步是后续差值计算准确的前提:
    df = df.sort_values(by=['city', 'date']).reset_index(drop=True)

第二步:计算单城市的每日新增住院数

利用pandas分组内的差分方法,直接计算每个城市组内当前行与上一行的累计值差值,不需要手动写shift逻辑,也能避免索引对齐的常见问题:
df['city_daily_new'] = df.groupby('city')['hospitalized'].diff()
针对计算结果的边界值与异常值做修正:

  • 每个城市最早的一条累计记录,没有前序对比值,diff会返回空值,这类日期的当日新增就等于当天的累计值,直接填充即可:
    df['city_daily_new'] = df['city_daily_new'].fillna(df['hospitalized'])
  • 数据上报可能出现累计值倒降的异常(比如前一天累计100,当天上报90),diff会算出负数,实际场景中不可能出现负的新增住院人数,统一做下截断,负值替换为0:
    df['city_daily_new'] = df['city_daily_new'].clip(lower=0)

第三步:按日期汇总得到每日总新增

将所有城市的当日新增值按日期聚合求和,最终得到每日一行的结果表:
daily_total = df.groupby('date', as_index=False)['city_daily_new'].sum().rename(columns={'city_daily_new':'total_daily_new'})

第四步:筛选近30天数据

筛选时注意不要直接用现实中的当前日期做判断,要以数据集本身的最大日期为基准,避免数据截止时间和现实时间错位导致筛选结果为空:

max_record_date = daily_total['date'].max()
recent_30d_data = daily_total[daily_total['date'] >= max_record_date - pd.Timedelta(days=30)]

高频踩坑提醒

  • 不按城市分组直接做全表差分:会把A城市最后一条的累计值和B城市第一条的累计值做减法,算出完全无意义的异常值
  • 跳过排序步骤直接计算差值:如果原始数据是乱序排列(比如城市块穿插、日期倒序),得到的差值根本不是相邻自然日的真实差
  • 近30天筛选用固定现实日期:如果你的数据是2020年-2022年的历史数据,拿2024年的日期去筛选会得到全空的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 21:06:05