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

如何用Pandas计算带重置的多主机流量计数器滚动求和?

处理带重置的计数器流量统计(Pandas实现)

针对带主机名的流量计数器数据(计数器达到阈值会重置),可以通过以下步骤在Pandas中计算总流量或滚动累计流量:

示例数据准备

假设你的数据已经存储在Pandas DataFrame中,构造示例数据如下:

import pandas as pd

data = [
    ("host1", 5),
    ("host2", 19),
    ("host1", 7),
    ("host2", 29),
    ("host1", 9),
    ("host2", 3),
]
df = pd.DataFrame(data, columns=["hostname", "counter"])

核心逻辑实现

  1. 定义增量计算函数:按主机分组,针对每个组的计数器序列,计算每个数据点的流量增量:

    • 非重置场景:增量为当前值与前一个值的差值
    • 重置场景(当前值 < 前一个值):增量直接取当前值(因为重置后计数器从0开始,当前值即为该段已累计的流量)
    • 第一个数据点增量设为0(无法追溯之前的重置状态,仅计算采集起始后的流量)
  2. 生成增量列与累计流量:

def calculate_increments(group):
    # 计算当前值与前一个值的差值
    diffs = group["counter"].diff()
    # 重置时用当前值替换负差值,非重置时保留差值
    increments = diffs.where(diffs > 0, group["counter"])
    # 第一个数据点无前置值,增量设为0
    increments.iloc[0] = 0
    return increments

# 按主机分组计算增量
df["increment"] = df.groupby("hostname").apply(calculate_increments).reset_index(drop=True)

# 计算滚动累计流量(每个时间点的累计总流量)
df["cumulative_traffic"] = df.groupby("hostname")["increment"].cumsum()

# 计算每个主机的总流量
total_traffic = df.groupby("hostname")["increment"].sum()

结果验证

运行上述代码后,total_traffic输出为:

host1     4.0
host2    13.0
dtype: float64
  • host1的流量序列为5→7→9,无重置,总增量为(7-5)+(9-7)=4
  • host2的流量序列为19→29→3,发生重置,总增量为(29-19)+3=13,符合预期

查看完整DataFrame的滚动累计流量:

hostname  counter  increment  cumulative_traffic
0     host1        5        0.0                 0.0
1     host2       19        0.0                 0.0
2     host1        7        2.0                 2.0
3     host2       29       10.0                10.0
4     host1        9        2.0                 4.0
5     host2        3        3.0                13.0

内容的提问来源于stack exchange,提问作者John Oxley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:43:15