Python实现:基于距离条件统计事件X的特定时间间隔发生频次
解决步骤:时间间隔统计逻辑
接下来的核心是按工厂单独筛选有效事件,再基于时间序列计算符合条件的事件次数,具体代码和逻辑如下:
1. 确保时间列格式正确
首先必须把事件时间列转为datetime类型,否则无法计算时间差:
import pandas as pd # 替换成你的时间列实际名称,比如'timestamp' df['time'] = pd.to_datetime(df['time'])
2. 遍历每个工厂,单独处理统计
因为每个工厂的距离过滤逻辑是独立的,需要逐个处理:
# 存储每个工厂的最终统计结果 factory_stats = {} # 遍历所有工厂的距离列(即你之前处理的filtered的列) for factory_name in filtered.columns: # 第一步:筛选出该工厂距离≤5km的所有事件,按时间排序 valid_events = df.loc[filtered[factory_name].notna(), ['time']].sort_values('time').reset_index(drop=True) # 如果有效事件数不足2个,直接跳过(无法判断时间间隔) if len(valid_events) < 2: factory_stats[factory_name] = 0 continue # 第二步:计算每个事件与前一个事件的时间间隔(单位:分钟) valid_events['prev_interval'] = valid_events['time'].diff().dt.total_seconds() / 60 # 第三步:找出所有"前一次事件间隔≥50分钟"的事件(这些是间隔后的起始事件) trigger_events = valid_events[valid_events['prev_interval'] >= 50] # 第四步:统计每个触发事件之后10分钟内的事件次数 total_count = 0 for _, row in trigger_events.iterrows(): current_time = row['time'] # 定义10分钟的时间窗口:当前时间 ~ 当前时间+10分钟 window_end = current_time + pd.Timedelta(minutes=10) # 统计窗口内的事件数量(包含当前事件,若需求是"仅之后发生的"则去掉=current_time) window_events = valid_events[(valid_events['time'] >= current_time) & (valid_events['time'] <= window_end)] total_count += len(window_events) # 保存该工厂的统计结果 factory_stats[factory_name] = total_count # 转换为DataFrame,方便查看和导出 result = pd.DataFrame.from_dict(factory_stats, orient='index', columns=['符合条件的事件次数']) print(result)
关键逻辑说明
- 按工厂独立处理:每个工厂的有效事件(距离≤5km)是独立的,必须分开统计,不能混在一起计算时间间隔。
- 时间差计算:用
diff()计算相邻事件的时间差,转成分钟单位方便判断≥50分钟的条件。 - 窗口统计:对每个满足"间隔≥50分钟"的起始事件,划定之后10分钟的窗口,统计窗口内的事件数。如果需求是不包含当前事件,只统计之后发生的,把窗口条件改成
valid_events['time'] > current_time即可。
可选优化
如果数据集规模很大,可以用pd.Series.between_time或者滚动窗口API来提升效率,但上面的代码逻辑清晰,适合中小规模数据集。
内容的提问来源于stack exchange,提问作者Loli
相关产品推荐
相关产品推荐

