如何单次遍历事件列表统计每30分钟区间的事件数?
单次遍历实现30分钟区间事件统计
核心思路
无需对事件列表重复遍历48次,通过单次遍历+区间索引计算即可完成统计:
- 初始化长度为48的计数数组(对应一天内48个30分钟区间)
- 遍历每个事件时,计算其所属的区间索引,直接对对应位置的计数加1
- 全程仅依赖Python内置的
datetime模块,无需额外第三方库
代码实现
假设事件列表中的元素为时间字符串(若已是datetime对象可跳过解析步骤):
from datetime import datetime # 示例事件列表 event_list = [ "2024-05-20 00:12:30", "2024-05-20 00:45:10", "2024-05-20 12:30:00", "2024-05-20 23:50:00", "2024-05-20 00:20:00" ] # 初始化48个区间的计数,初始值为0 interval_counts = [0] * 48 for time_str in event_list: # 解析时间字符串为datetime对象,提取时分信息 event_time = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") # 计算当天已过的总分钟数 total_minutes = event_time.hour * 60 + event_time.minute # 计算所属区间的索引(0~47对应48个30分钟区间) idx = total_minutes // 30 # 对应区间计数+1 interval_counts[idx] += 1 # 格式化输出每个区间的统计结果 for idx, count in enumerate(interval_counts): # 计算区间起始时间 start_h = idx // 2 start_m = (idx % 2) * 30 # 计算区间结束时间 end_h = start_h if start_m == 0 else start_h + 1 end_m = 30 if start_m == 0 else 0 # 打印结果 print(f"{start_h:02d}:{start_m:02d}-{end_h:02d}:{end_m:02d} | 事件数量: {count}")
效率说明
该方案时间复杂度为O(n)(n为事件列表长度),相比原方案的O(48n),在数据量较大时性能提升显著——比如当事件数为100万时,原方案需执行4800万次操作,而本方案仅需100万次。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

