Pandas小时数据处理:计算早7点-12点时段的金额总和
问题与高效解决方案
原始数据
现有小时级Pandas DataFrame如下:
DATE TIME Amount 2022-11-07 21:00:00 10 2022-11-07 22:00:00 11 2022-11-08 07:00:00 10 2022-11-08 08:00:00 13 2022-11-08 09:00:00 12 2022-11-08 10:00:00 11 2022-11-08 11:00:00 13 2022-11-08 12:00:00 12 2022-11-08 13:00:00 10 2022-11-08 14:00:00 9 ...
需求
新增sum_morning列,仅在每日12:00:00的行中填入当日07:00:00-12:00:00时段Amount的总和,其余行填充NaN。预期结果:
DATE TIME Amount sum_morning 2022-11-07 21:00:00 10 NaN 2022-11-07 22:00:00 11 NaN 2022-11-08 07:00:00 10 NaN 2022-11-08 08:00:00 13 NaN 2022-11-08 09:00:00 12 NaN 2022-11-08 10:00:00 11 NaN 2022-11-08 11:00:00 13 NaN 2022-11-08 12:00:00 12 71 2022-11-08 13:00:00 10 NaN 2022-11-08 14:00:00 9 NaN ...
注:数据存在时间间隙(如22:00-07:00无数据),shift等依赖连续行的方法不适用;已掌握「筛选时段数据→按日期分组求和→合并回原DataFrame」的方案,需更高效实现。
高效实现方案
直接通过分组+条件映射+赋值完成,无需额外合并操作,性能更优:
代码示例
import pandas as pd # 构造示例数据 data = { 'DATE': ['2022-11-07', '2022-11-07', '2022-11-08', '2022-11-08', '2022-11-08', '2022-11-08', '2022-11-08', '2022-11-08', '2022-11-08', '2022-11-08'], 'TIME': ['21:00:00', '22:00:00', '07:00:00', '08:00:00', '09:00:00', '10:00:00', '11:00:00', '12:00:00', '13:00:00', '14:00:00'], 'Amount': [10, 11, 10, 13, 12, 11, 13, 12, 10, 9] } df = pd.DataFrame(data) # 1. 先计算每个日期7-12点的Amount总和,得到日期与总和的映射字典 morning_sum_map = df[df['TIME'].str[:2].astype(int).between(7,12)]\ .groupby('DATE')['Amount'].sum().to_dict() # 2. 初始化sum_morning列为NaN,仅对12:00的行填充对应日期的总和 df['sum_morning'] = pd.NA df.loc[df['TIME'] == '12:00:00', 'sum_morning'] = df.loc[df['TIME'] == '12:00:00', 'DATE'].map(morning_sum_map)
方案优势
- 性能最优:仅遍历数据两次(一次计算总和映射,一次赋值),无冗余操作,大数据量下比合并方案效率提升明显;
- 逻辑清晰:拆分计算与赋值步骤,易于理解和维护;
- 兼容性强:不受时间间隙影响,无论时段内是否有数据缺失,都能准确统计当日目标时段的总和。
内容的提问来源于stack exchange,提问作者RazzleDazzle
相关产品推荐
相关产品推荐

