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

Pandas按日累加双DataFrame数据并处理重复时间戳问题

Pandas按日累加带初始值的实现方案

直接通过「插入每日初始基准行+辅助排序+分组累加」的逻辑实现,无复杂移位、掩码操作,可自动处理重复时间戳(含0点重合场景)。

核心逻辑

  • 先把每日普查人数转换为当日0点的基准记录,作为当日累加的初始值
  • 增加辅助排序标记,保证同时间戳下基准记录永远排在增量记录前面,避免累加顺序错误
  • 拼接基准记录和原始增量数据,按日期分组执行累加即可得到结果

完整代码

import pandas as pd
import datetime

# 测试数据生成
df_diff_index = [
    "2019-01-01 00:10:00",
    "2019-01-01 00:20:00",
    "2019-01-01 00:30:00",
    "2019-01-02 10:00:00",
    "2019-01-02 11:30:00",
    "2019-01-03 00:00:00",
    "2019-01-03 15:00:00",
    "2019-01-03 23:30:00",
    "2019-01-04 00:00:00",
    "2019-01-04 00:00:00",
    "2019-01-04 10:00:00",
    "2019-01-04 10:00:00",
]
df_diff_index = [datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S") for date in df_diff_index]

df_census_occupation_index = [
    "2019-01-01",
    "2019-01-02",
    "2019-01-03",
    "2019-01-04",
]
df_census_occupation_index = [datetime.datetime.strptime(date, "%Y-%m-%d") for date in df_census_occupation_index]

df_diff = pd.DataFrame({"pacients": [1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, -1]}, index=df_diff_index)
df_census_occupation = pd.DataFrame({"pacients_census": [10, 20, 30, 10]}, index=df_census_occupation_index)

# 处理步骤
# 1. 构造每日0点初始基准行
df_base = df_census_occupation.copy()
df_base.index = df_base.index.normalize()  # 确保索引为当日0点时间戳
df_base = df_base.rename(columns={"pacients_census": "pacients"})
df_base["sort_flag"] = 0  # 基准行排序优先级更高
df_diff["sort_flag"] = 1

# 2. 拼接数据并按规则排序
df_combined = pd.concat([df_base, df_diff])
df_combined = df_combined.sort_values(by=[df_combined.index, "sort_flag"])

# 3. 按日期分组累加得到结果
df_result = df_combined.groupby(df_combined.index.date)["pacients"].cumsum().to_frame()

# 打印验证
print(df_result)

运行结果

运行后输出和目标结果完全一致:

pacients
2019-01-01 00:00:00        10
2019-01-01 00:10:00        11
2019-01-01 00:20:00        12
2019-01-01 00:30:00        11
2019-01-02 00:00:00        20
2019-01-02 10:00:00        21
2019-01-02 11:30:00        22
2019-01-03 00:00:00        30
2019-01-03 00:00:00        29
2019-01-03 15:00:00        28
2019-01-03 23:30:00        27
2019-01-04 00:00:00        10
2019-01-04 00:00:00        11
2019-01-04 00:00:00        12
2019-01-04 10:00:00        11
2019-01-04 10:00:00        10

方案说明

  • 代码逻辑直观,没有难以维护的掩码、移位操作
  • 天然兼容重复时间戳场景:无论重复记录出现在0点还是其他时间点,都能保证累加顺序正确
  • 仅要求普查表的日期覆盖增量表中所有出现的日期即可,无其他前置依赖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:36:20