Python:每秒捕获流数据、每5分钟打印ltt列均值的实现问题求助
解决方案:每秒捕获数据,每5分钟打印一次5分钟均值
问题分析
当前代码在strategy1每秒被调用时都会执行打印操作,且每次基于全量历史数据计算分组均值,既不符合“每5分钟打印一次”的需求,也存在效率浪费。
修改后的代码
import pandas as pd from datetime import timedelta # 全局变量:存储未处理的最新记录,以及上次打印的5分钟窗口起始时间 datalist = [] last_print_time = None def strategy1(record): global datalist, last_print_time # 解析当前记录的时间并替换原字段,避免后续重复解析 current_ltt = pd.to_datetime(record['ltt'], format="%a %b %d %H:%M:%S %Y") record['ltt'] = current_ltt datalist.append(record) # 初始化上次打印时间为第一条记录对应的5分钟整点 if last_print_time is None: last_print_time = current_ltt.floor('5min') # 检查是否到达下一个5分钟打印节点 if current_ltt >= last_print_time + timedelta(minutes=5): # 筛选当前5分钟窗口内的记录 df = pd.DataFrame(datalist) window_df = df[(df['ltt'] >= last_print_time) & (df['ltt'] < last_print_time + timedelta(minutes=5))] if not window_df.empty: # 计算并打印该窗口的均值 mean_result = window_df.groupby(pd.Grouper(key='ltt', freq='5min')).mean() print(f"=== {last_print_time.strftime('%Y-%m-%d %H:%M')} 至 {(last_print_time + timedelta(minutes=5)).strftime('%Y-%m-%d %H:%M')} 的均值 ===") print(mean_result) # 更新打印时间到下一个5分钟节点 last_print_time += timedelta(minutes=5) # 清理列表,仅保留未进入下一个打印窗口的新记录 datalist = [item for item in datalist if item['ltt'] >= last_print_time]
关键改动说明
- 打印时机控制:通过
last_print_time跟踪上次打印的5分钟窗口起始点,仅当当前记录时间到达下一个5分钟节点时才触发打印。 - 减少重复解析:每条记录仅解析一次
ltt时间,避免重复转换带来的性能损耗。 - 精准数据计算:打印时仅处理当前5分钟窗口内的数据,而非全量历史数据,提升计算效率。
- 内存占用优化:打印后清理过期记录,避免
datalist无限增长占用内存。 - 时间边界规整:初始化时将
last_print_time对齐到最近的5分钟整点,确保打印窗口的时间边界统一(如00分、05分、10分等)。
内容的提问来源于stack exchange,提问作者vrreddy1234
相关产品推荐
相关产品推荐

