You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:45:34