如何用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
相关产品推荐
相关产品推荐

