基于日期字段的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就和你想要的结果完全一致了:
| DateTime | Tag | Qty | RBQ | RSQ |
|---|---|---|---|---|
| 2025-01-01 13:00:00 | 1 | 270 | 270 | 0 |
| 2025-01-03 13:22:00 | 1 | 32 | 302 | 0 |
| 2025-01-10 12:33:00 | 2 | 44 | 302 | 44 |
| 2025-01-22 10:04:00 | 2 | 120 | 302 | 164 |
| 2025-01-29 09:30:00 | 3 | 182 | 484 | 164 |
| 2025-02-02 15:05:00 | 1 | 216 | 600 | 164 |
为什么这个方法有效?
cumsum()是按行顺序累加的,当我们用np.where把不符合条件的Qty替换成0时,累加过程中就不会把这些值加进去,而符合条件的行则会把当前Qty加入累计,这样就完美实现了“仅对符合条件的行按时间累计求和,不符合条件时保持之前的累计值”的需求。
备注:内容来源于stack exchange,提问作者Abdul Gaffoor G K
相关产品推荐
相关产品推荐

