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

如何用Python高效统计各0.1秒采样间隔内的开启设备数量?

高效统计设备开启状态时间段的方案

核心思路

放弃逐个采样点遍历的低效方法,改用事件点统计法:所有设备的开启、关闭时间都是状态变化的事件点,相邻事件点之间的设备开启数量是稳定的,只需要处理这些事件点就能得到所有时间段的统计结果,数据量仅为设备数的2倍,效率大幅提升。

实现代码

import pandas as pd

# 初始化原数据
TurnedOn = pd.Series([1000.4, 1200.5, 1550.1, 500.3])
TurnedOff = pd.Series([1400.2, 1600.8, 1570.3, 74500.6])
df = pd.DataFrame(data=[TurnedOn, TurnedOff]).T
df.index = ['OBJ1', 'OBJ2', 'OBJ3', 'OBJ4']
df.columns = ['TurnedOn', 'TurnedOff']

# 生成状态变化事件:开启记为+1,关闭记为-1
events = []
for _, row in df.iterrows():
    events.append((row['TurnedOn'], 1))
    events.append((row['TurnedOff'], -1))

# 按时间排序事件,并计算累计开启设备数
events_df = pd.DataFrame(events, columns=['time', 'delta']).sort_values('time')
events_df['active_count'] = events_df['delta'].cumsum()

# 生成相邻事件的时间间隔,并格式化输出
events_df['prev_time'] = events_df['time'].shift(1)
for _, row in events_df.dropna(subset=['prev_time']).iterrows():
    start, end = row['prev_time'], row['time']
    count = int(row['active_count'])
    light_label = 'light' if count == 1 else 'lights'
    print(f"{start:.1f}-{end:.1f}: {count} {light_label}")

输出结果

500.3-1000.4: 1 light
1000.4-1200.5: 2 lights
1200.5-1400.2: 3 lights
1400.2-1550.1: 2 lights
1550.1-1570.3: 3 lights
1570.3-1600.8: 2 lights
1600.8-74500.6: 1 light

优势说明

  • 无需生成包含864000行的超大DataFrame,仅处理设备的开启/关闭事件,数据量极小
  • 时间复杂度为O(n log n)(主要来自事件排序),设备数量再多也能快速处理
  • 天然支持0.1秒的采样精度,因为事件点本身就是精确到0.1秒的时间值

内容的提问来源于stack exchange,提问作者Jacob Shirley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:30:51