如何使用Pandas将时间戳序列可视化为活动条图表
实现思路
通过Pandas内置的时间处理能力完成数据清洗和格式转换,结合Matplotlib的热力图能力渲染活动条,全程无需手动逐像素计算,代码量少易维护。
- 仅读取时间戳字段,自动忽略
last_activity数值 - 自动完成时间戳分钟级舍入、去重
- 单/多日数据都可适配,自动生成对应行数的活动条
完整代码
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 1. 数据读取与处理 # 仅读取date列,自动忽略last_activity字段 df = pd.read_csv("你的文件路径.csv", usecols=["date"]) # 转换为datetime格式并按分钟四舍五入 df["datetime"] = pd.to_datetime(df["date"]).dt.round("min") # 提取日期和当日分钟偏移量(0-1439对应全天1440分钟) df["date"] = df["datetime"].dt.date df["minute_offset"] = df["datetime"].dt.hour * 60 + df["datetime"].dt.minute # 同一分钟的重复记录去重 df = df.drop_duplicates(subset=["date", "minute_offset"]) # 2. 生成活动矩阵 all_dates = sorted(df["date"].unique()) day_count = len(all_dates) # 矩阵每行对应一天,每列对应一分钟,1=有活动,0=无活动 activity_matrix = np.zeros((day_count, 1440), dtype=int) for idx, date in enumerate(all_dates): active_mins = df[df["date"] == date]["minute_offset"].values activity_matrix[idx, active_mins] = 1 # 3. 绘图 plt.figure(figsize=(16, 1 * day_count)) # 高度随天数自动调整 # 渲染活动条,红色对应有活动的分钟,白色为无活动 plt.imshow(activity_matrix, aspect="auto", cmap="Reds", vmin=0, vmax=1) # X轴设置:显示小时刻度 plt.xticks(ticks=np.arange(0, 1440, 60), labels=[f"{h}:00" for h in range(24)]) plt.xlabel("时间") # Y轴设置:显示日期,单天数据可注释掉下两行隐藏Y轴 plt.yticks(ticks=np.arange(day_count), labels=all_dates) plt.ylabel("日期") # 自定义图表标题 plt.title("设备活动时间分布", fontsize=14) # 隐藏多余边框 plt.gca().spines[["top", "right", "left", "bottom"]].set_visible(False) plt.tight_layout() plt.show()
自定义调整说明
- 时间取整规则:如果需要向下取整到分钟而非四舍五入,将
dt.round("min")替换为dt.floor("min")即可 - 若不需要显示Y轴日期,注释掉Y轴设置对应的两行代码即可
- 修改
plt.title的参数即可更换图表标题 - 若需要调整时间显示粒度,修改
plt.xticks的步长参数即可,比如步长设为30就是每30分钟一个刻度
内容的提问来源于stack exchange,提问作者Martin Thoma
相关产品推荐
相关产品推荐

