【问题标题】:plotting timestamp speed profile from dataframe从数据框中绘制时间戳速度曲线
【发布时间】:2022-10-07 08:18:54
【问题描述】:

我的数据框是汽车旅行的时间序列和相对较高粒度的相应速度。

df = pd.DataFrame({\'session_id\': [69,69,69,69,69,69,69,71,71,71,71,71,86,86,86,86,86,86],
 \'timestamp\': [\'2016-04-01 08:04:00\',\'2016-04-01 08:04:05\',\'2016-04-01 08:04:10\',
               \'2016-04-01 08:04:15\',\'2016-04-01 08:04:22\',\'2016-04-01 08:04:30\',
               \'2016-04-01 08:04:37\',\'2016-04-01 01:04:10\',\'2016-04-01 01:04:13\',
               \'2016-04-01 01:04:20\',\'2016-04-01 01:04:24\',\'2016-04-01 01:04:31\',
               \'2016-04-01 17:56:46\',\'2016-04-01 17:58:54\',\'2016-04-01 18:04:00\',
               \'2016-04-01 18:04:50\',\'2016-04-01 18:05:21\',\'2016-04-01 18:06:10\'],
 \'speed\': [0.0,26.8551,27.673,18.0626,21.4778,17.6581,24.4941,14.42,8.94,13.69,
           0.0,0.37,16.5,0.0,17.25,3.5,11.75,6.25]
 })

df.head()
  session_id    timestamp         speed
0   69      2016-04-01 08:04:00   0.0000
1   69      2016-04-01 08:04:05  26.8551
2   69      2016-04-01 08:04:10  27.6730
3   69      2016-04-01 08:04:15  18.0626
4   69      2016-04-01 08:04:22  21.4778

在一天中的不同时间记录数据,持续 5 天。

我需要一种将速度曲线绘制为线图的方法。例如 y 轴上的速度,x 轴上的时间。因为这些会话是长时间记录的,所以我对从头到尾策划旅行很感兴趣。相反,我会对开始速度感兴趣,比如 15 分钟开始。

由于在某些情况下数据是在不同的日期记录的,我删除了数据部分,而是想绘制时间部分。

df[\'timestamp\'] = df[\'timestamp\'].dt.time
df.head()
    session_id  timestamp   speed
0      69       08:04:00    0.0000
1      69       08:04:05    26.8551
2      69       08:04:10    27.6730
3      69       08:04:15    18.0626
4      69       08:04:22    21.4778

尝试绘制数据:

sns.lineplot(data=df, x=\'timestamp\', y=\'speed\')

TypeError: Invalid object type at position 0
  • 有没有办法根据时间绘制每个会话的配置文件速度?
  • 我可以重新设置时间,让它们同时开始,比如00.00,这样我就可以轻松比较速度趋势?

编辑

按照@abokey 的回答,我现在可以这样绘制:

df[\'timestamp\'] = df[\'timestamp\'].dt.strftime(\'%H:%M:%S\')
sns.lineplot(data=df, x=\'timestamp\', y=\'speed\', hue=\'session_id\')

这使:

有没有办法重置所有会话的开始时间,以便他们的情节同时开始,比如00:00

    标签: python pandas datetime matplotlib seaborn


    【解决方案1】:

    在调用seaborn.lineplot 之前,您需要使用pandas.Series.dt.strftime 将您的时间戳转换为字符串。

    尝试这个 :

    df['timestamp'] = pd.to_datetime(df['timestamp'], format='%Y-%m-%d %H:%M:%S').dt.strftime('%H:%M:%S')
    
    sns.lineplot(data=df, x='timestamp', y='speed')
    

    # 输出 :

    【讨论】:

      【解决方案2】:

      将时间戳转换为字符串是一个糟糕的主意。 Seaborn 会将它们视为分类的,它们之间的相对距离将被忽略。这就是为什么绘图中的点都在 x 轴上均匀分布的原因。

      例如,尝试绘制sns.lineplot(x=["1", "9", "10"], y=[1,4,2])

      这是您最后一个问题的解决方案“有没有办法重置所有会话的开始时间,以便他们的情节同时开始”

      timestamp 列从字符串转换为pandas.Timestamp

      df["timestamp"] = pd.to_datetime(df["timestamp"])
      

      session_id 上分组并创建名为pandas.Timedeltatimedelta 列,用于时间戳和最小时间戳之间的差异

      def make_relative_timedelta(d):
          origin = d["timestamp"].min()
          return d.assign(timedelta = d["timestamp"] - origin)
      
      df = df.groupby("session_id").apply(make_relative_timedelta)
      

      阴谋

      sns.lineplot(data=df, x='timedelta', y='speed', hue='session_id')
      

      如果您想将 timedelta 列转换为分钟数,而不是直接使用 timedelta(将以纳秒为单位绘制),然后执行此操作以转换为浮点数:

      df["timedelta"] = ["timedelta"]/pd.Timedelta("1m")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-14
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        相关资源
        最近更新 更多