如何对datetime格式索引的DataFrame指定行子集进行列值求和
pandas Datetime索引按时间范围子集求和实现方法
核心操作步骤
- 第一步:确认索引为标准datetime格式
如果你的索引还没转成时间类型,先执行转换,否则时间切片会失效:import pandas as pd data.index = pd.to_datetime(data.index) - 第二步:按指定时间范围切片取子集
pandas对DatetimeIndex原生支持字符串标签切片,规则为左闭右闭(起止时间对应的行都会被包含),不需要写复杂的布尔判断:# 替换成你需要的起止时间即可 start_time = '2022-03-18 07:37:51' end_time = '2022-03-18 07:37:55' subset = data.loc[start_time:end_time] - 第三步:对子集按列求和
直接调用sum()方法即可得到所有数值列在该时间范围内的总和:
此时# 加numeric_only=True可以自动跳过非数值列,避免类型报错 sum_res = subset.sum(numeric_only=True)sum_res是一个Series,索引为原DataFrame的列名,值为对应列的区间求和结果。
追加求和结果到原表
如果你需要把求和结果作为单独一行拼接在原DataFrame末尾,和预期效果一致,可以按如下代码操作:
# 将求和结果转为行格式,设置自定义行索引 sum_row = sum_res.to_frame().T sum_row.index = [f'{start_time} ~ {end_time} 求和'] # 拼接回原表 final_data = pd.concat([data, sum_row])
补充说明
- 时间切片支持简写:如果要取某一天/某一小时的所有数据,不需要写全时间,比如
data.loc['2022-03-18']可取当天所有行,data.loc['2022-03-18 07']可取当天7点的所有行。 - 布尔索引等效写法:如果习惯用条件筛选,也可以用如下写法取子集,效果和切片完全一致:
subset = data[ (data.index >= pd.Timestamp(start_time)) & (data.index <= pd.Timestamp(end_time)) ]
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

