首页 > 解决方案 > 将时间序列中的时间戳转换为相同的索引

问题描述

我有一个数据框,每 5 分钟包含一个时间戳,每个 ID 都有一个值。现在,我需要执行一些分析,我想在同一个时间窗口上绘制所有时间序列。我的数据框类似于这个:

ID      timestamp                           value
 12345    2017-02-09 14:35:00               60.0
 12345    2017-02-09 14:40:00               62.0
 12345    2017-02-09 14:45:00               58.0
 12345    2017-02-09 14:50:00               60.0
 54321    2017-03-09 13:35:00               50.0 
 54321    2017-03-09 13:40:00               58.0 
 54321    2017-03-09 13:45:00               59.0 
 54321    2017-03-09 13:50:00               61.0 

例如,在 xy 轴上,我需要使用 x=0 值作为每个 ID 的第一个时间戳,并使用 x=1 作为 5 分钟后的第二个时间戳,依此类推。到目前为止,我使用以下代码每 5 分钟正确重新采样一次:

df = df.set_index('Date').resample('5T').mean().reset_index()

但是,鉴于每个 ID 都以不同的时间戳开始,我不知道如何修改时间戳以便使用每个 ID 的第一个测量日期作为时间戳 0,并且每 5 分钟的每个下一个时间戳作为时间戳 1,时间戳2、timestamp 3、ecc,以绘制每个ID的序列以图形化的方式面对它们。样本最终 df 可能是:

 ID      timestamp       value
 12345    0               60.0
 12345    1               62.0
 12345    2               58.0
 12345    3               60.0
 54321    0               50.0 
 54321    1               58.0 
 54321    2               59.0 
 54321    3               61.0 

使用这个数据框,是否可以绘制在同一点开始和结束的所有系列?从 0 开始,3 天后结束。如何创建如此不同的时间戳并在同一个图中为每个 ID 绘制每个系列?非常感谢你

标签: pythonpandas

解决方案


首先以 5 分钟间隔创建一个带有时间戳编号的新列。

df['ts_number'] = df.groupby(['ID']).timestamp.apply(lambda x: (x - x.min())/pd.Timedelta(minutes=5))

如果您事先知道所有时间戳都以 5 分钟为间隔并且已排序,那么您也可以使用

df['ts_number'] = df.groupby(['ID']).cumcount()

然后绘制透视数据:

df.pivot('ts_number', 'ID', 'value').plot()

<code>在此输入图片说明</code>


推荐阅读