Python实现X、Y轴为24小时维度的事件起止时间散点图绘制
双时间轴事件分布散点图实现方案
核心实现逻辑:将每个事件的起始时分映射为X轴坐标,结束时分映射为Y轴坐标,双轴统一设置为00:00到23:59的全24小时范围,每个散点对应单条事件记录,可直观看出不同时段的事件时长分布、聚类特征。
分步落地操作
数据预处理
- 读取CSV后,先对
Start date、End date两列做标准时间格式解析,不需要手动拆分字符串匹配时分,pandas的时间解析能力可以直接兼容你提供的“月/日/年 时分”格式的时间戳。 - 为了避免字符串排序、格式不匹配的问题,统一把时间转换为从00:00开始累计的分钟数作为坐标值:比如15:33对应数值为15*60+33=933,16:00对应数值为960,双轴的数值范围统一为0(对应00:00)到1439(对应23:59),覆盖完整24小时。
- 提前过滤跨天事件:如果存在23点起始、次日凌晨结束的事件,需要单独标记分组,避免和当天凌晨结束的事件混淆,干扰分布判断。
绘图配置
- 绘图时先添加一条Y=X的45度虚线参考线:理论上同一日内的事件结束时间必然不早于起始时间,参考线下方是符合逻辑的事件分布区,参考线上方的点即为时间录入错误、跨天的异常事件。
- 坐标轴刻度按每1小时为间隔设置,把累计分钟数的刻度值替换为“HH:MM”格式的时间标签,同时锁定双轴范围为0-1440,避免自动缩放导致的时段覆盖不全。
- 散点设置半透明属性(alpha=0.6左右),避免高密度区域的点堆叠看不清分布轮廓。
- 如果数据量极大、散点堆叠严重,可以把纯散点替换为密度热力点图,更清晰呈现聚类位置。
可直接复用的实现代码
import pandas as pd import matplotlib.pyplot as plt # 替换为你自己的CSV文件路径 df = pd.read_csv("你的事件数据文件.csv") # 解析时间列 df["Start date"] = pd.to_datetime(df["Start date"]) df["End date"] = pd.to_datetime(df["End date"]) # 将时分转换为全天累计分钟数 def convert_to_min(timestamp): return timestamp.hour * 60 + timestamp.minute df["start_coord"] = df["Start date"].apply(convert_to_min) df["end_coord"] = df["End date"].apply(convert_to_min) # 初始化画布 plt.figure(figsize=(8, 8)) # 绘制45度参考线 plt.plot([0, 1440], [0, 1440], color="gray", linestyle="--", label="时长为0的参考线") # 绘制散点 plt.scatter(df["start_coord"], df["end_coord"], alpha=0.6, s=20) # 设置双轴的24小时刻度 tick_positions = list(range(0, 1441, 60)) tick_labels = [f"{hour:02d}:00" for hour in range(0, 25)] plt.xticks(tick_positions, tick_labels, rotation=45) plt.yticks(tick_positions, tick_labels) # 锁定双轴范围,保证覆盖全天 plt.xlim(0, 1440) plt.ylim(0, 1440) plt.xlabel("事件起始时间") plt.ylabel("事件结束时间") plt.title("全时段事件起止时间分布散点图") plt.legend() plt.tight_layout() plt.show()
分布分析技巧
- 若散点沿45度参考线形成窄条聚集,说明对应时段的事件普遍时长很短,多为分钟级的快速事件。
- 若散点和参考线的垂直距离越大,说明对应起始时段的事件整体时长越长。
- 若出现明显的独立散点簇,即可定位到特定时长、特定起始时段的事件聚类,为后续事件分类提供依据。
内容的提问来源于stack exchange,提问作者TheIvanTheory
相关产品推荐
相关产品推荐

