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
相关产品推荐
相关产品推荐

