基于DataFrame绘制车速时间曲线及统一会话起始时间
解决方案
前提假设
假设你的DataFrame命名为df,包含核心列:
timestamp:datetime类型的时间戳speed:车速数值trip_id:每个行程的唯一标识(无该列的话,需先按连续时段划分行程,方法见下文)
1. 预处理:提取各行程前15分钟数据
先确保时间戳格式正确,再按行程分组筛选目标数据:
import pandas as pd # 强制转换timestamp为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp']) # 若没有trip_id,先生成行程标识(以间隔1小时作为新行程判断阈值) if 'trip_id' not in df.columns: df['is_new_trip'] = df['timestamp'].diff().dt.total_seconds() > 3600 df['trip_id'] = df['is_new_trip'].cumsum() # 计算每个行程的相对时间(单位:分钟,0为行程起始) df['relative_min'] = df.groupby('trip_id')['timestamp'].transform( lambda x: (x - x.min()).dt.total_seconds() / 60 ) # 筛选仅保留前15分钟的数据 filtered_df = df[df['relative_min'] <= 15]
2. 统一所有会话起始时间为00:00
上面生成的relative_min已经是相对于行程起点的分钟数,若要显示为HH:MM格式的时间字符串,可执行:
filtered_df['relative_time_str'] = pd.to_datetime(filtered_df['relative_min'], unit='m').dt.strftime('%H:%M')
3. 绘制各会话的车速曲线
用seaborn绘制多行程对比折线图,支持两种X轴格式:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(12,6)) # 方案1:用分钟数作为X轴(数值型,利于精准对比) sns.lineplot(data=filtered_df, x='relative_min', y='speed', hue='trip_id', alpha=0.7) # 方案2:用HH:MM字符串作为X轴(更直观) # sns.lineplot(data=filtered_df, x='relative_time_str', y='speed', hue='trip_id', alpha=0.7) plt.xlabel('相对时间(分钟,0为行程起始)') plt.ylabel('车速') plt.title('各行程前15分钟车速趋势对比') plt.legend(title='行程ID', bbox_to_anchor=(1.05, 1), loc='upper left') plt.grid(True) plt.show()
问题复盘
你之前遇到的TypeError,是因为直接使用不带日期的时间值作为X轴时,seaborn无法处理不同行程的重复时间点冲突。改用相对时间(相对于行程起点的差值)就能彻底避免这个问题,同时天然实现了起始时间统一的需求。
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

