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

基于日期字段的Pandas条件累计求和实现方法

基于日期字段的Pandas条件累计求和实现方法

嗨,这个需求其实很好解决,咱们一步步来实现你想要的效果:

首先,得确保你的数据是按DateTime字段排序的(毕竟累计求和是按时间顺序来的),然后我们可以通过构造条件列再做累计求和来得到目标列。

步骤1:准备数据并确保时间顺序正确

先把你的数据转换成Pandas DataFrame,并且把DateTime转换成时间类型,同时按时间排序(如果原始数据已经是排好序的,这一步可以简化,但建议还是做一下,避免后续出错):

import pandas as pd
import numpy as np

# 构造你的数据集
data = {
    'DateTime': ['2025-01-01 13:00', '2025-01-03 13:22', '2025-01-10 12:33',
                 '2025-01-22 10:04', '2025-01-29 09:30', '2025-02-02 15:05'],
    'Tag': [1, 1, 2, 2, 3, 1],
    'Qty': [270, 32, 44, 120, 182, 216]
}

df = pd.DataFrame(data)
# 将字符串转为时间类型
df['DateTime'] = pd.to_datetime(df['DateTime'])
# 按时间排序并重置索引
df = df.sort_values('DateTime').reset_index(drop=True)

步骤2:计算条件累计求和

我们可以用np.where来快速生成符合条件的数值列,再对这些列做累计求和(cumsum()),这样就能得到你要的RBQ和RSQ:

# 计算RBQ:Tag不等于2时累加Qty,否则加0(相当于继承之前的累计值)
df['RBQ'] = np.where(df['Tag'] != 2, df['Qty'], 0).cumsum()

# 计算RSQ:Tag等于2时累加Qty,否则加0
df['RSQ'] = np.where(df['Tag'] == 2, df['Qty'], 0).cumsum()

最终结果

运行完上面的代码后,你得到的DataFrame就和你想要的结果完全一致了:

DateTimeTagQtyRBQRSQ
2025-01-01 13:00:0012702700
2025-01-03 13:22:001323020
2025-01-10 12:33:0024430244
2025-01-22 10:04:002120302164
2025-01-29 09:30:003182484164
2025-02-02 15:05:001216600164

为什么这个方法有效?

cumsum()是按行顺序累加的,当我们用np.where把不符合条件的Qty替换成0时,累加过程中就不会把这些值加进去,而符合条件的行则会把当前Qty加入累计,这样就完美实现了“仅对符合条件的行按时间累计求和,不符合条件时保持之前的累计值”的需求。

备注:内容来源于stack exchange,提问作者Abdul Gaffoor G K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 20:18:00