如何用Python将带起止时间的事件转换为并发数时间序列
事件并发数统计与可视化自动化实现
核心思路
把每个事件的开始时间标记为「并发数+1」的事件,结束时间标记为「并发数-1」的事件;将所有时间点排序后,按时间顺序累加这些变化值,就能得到任意时刻的并发数。再基于这个结果生成连续时间序列,最后完成可视化。
代码实现步骤
1. 导入依赖库
import pandas as pd import matplotlib.pyplot as plt
2. 准备/加载事件数据
假设你的事件数据是包含start_time和end_time的结构,这里用示例数据演示(可直接替换为你的实际数据):
# 示例事件数据 events = [ {"start_time": "2024-05-20 09:00:00", "end_time": "2024-05-20 09:30:00"}, {"start_time": "2024-05-20 09:15:00", "end_time": "2024-05-20 09:45:00"}, {"start_time": "2024-05-20 09:20:00", "end_time": "2024-05-20 10:00:00"}, {"start_time": "2024-05-20 09:50:00", "end_time": "2024-05-20 10:20:00"}, ] # 转为DataFrame并解析时间格式 df = pd.DataFrame(events) df["start_time"] = pd.to_datetime(df["start_time"]) df["end_time"] = pd.to_datetime(df["end_time"])
3. 生成事件变化点
将每个事件拆分为「开始+1」和「结束-1」两个记录:
# 拆分开始事件 start_events = df[["start_time"]].rename(columns={"start_time": "timestamp"}) start_events["delta"] = 1 # 拆分结束事件 end_events = df[["end_time"]].rename(columns={"end_time": "timestamp"}) end_events["delta"] = -1 # 合并并排序所有事件点 all_events = pd.concat([start_events, end_events]).sort_values("timestamp")
4. 计算并发数时间序列
累加delta值得到每个时间点的并发数,再生成连续时间序列(按1分钟采样,可按需调整频率):
# 计算累计并发数 all_events["concurrent"] = all_events["delta"].cumsum() # 生成连续时间序列(覆盖所有事件的时间范围) min_time = all_events["timestamp"].min() max_time = all_events["timestamp"].max() time_range = pd.date_range(start=min_time, end=max_time, freq="1min") # 合并到连续时间序列,填充缺失值(前向填充保证中间时刻并发数正确) concurrent_ts = pd.merge( pd.DataFrame({"timestamp": time_range}), all_events, on="timestamp", how="left" ).fillna(method="ffill").fillna(0) # 初始时刻并发数设为0
5. 绘制可视化图表
plt.figure(figsize=(12, 6)) plt.plot(concurrent_ts["timestamp"], concurrent_ts["concurrent"], marker="o", markersize=3, linestyle="-") # 设置图表样式 plt.title("事件并发数变化趋势") plt.xlabel("时间") plt.ylabel("并发事件数量") plt.grid(True, alpha=0.3) plt.xticks(rotation=45) plt.tight_layout() # 保存或显示图表 plt.savefig("concurrent_events.png") plt.show()
自定义调整点
- 采样频率:修改
pd.date_range的freq参数,比如"30s"(30秒)、"5min"(5分钟) - 时间精度:如果事件时间包含毫秒,确保
pd.to_datetime解析逻辑适配 - 异常处理:可添加对无效时间、重复事件的校验逻辑
内容的提问来源于stack exchange,提问作者Daniel Baquero
相关产品推荐
相关产品推荐

