提问者:小点点

将事件数据帧(开始-停止)转换为常规时间序列


我正在处理一个事件数据集。每行都有一个开始时间、一个结束时间和一个值。

它看起来像这个:

df = pd.DataFrame({'start': ['2015-01-05 12:21:00', '2015-01-05 18:01:23', '2015-01-05 23:11:01'], 'end': ['2015-01-05 13:18:45', '2015-01-05 21:03:51', '2015-01-05 12:08:11'], 'value': [3, 4, 5]})

    end start   value
0   2015-01-07 11:18:45 2015-01-07 11:35:00 3
1   2015-01-07 12:08:11 2015-01-07 23:11:01 5
2   2015-01-07 17:03:51 2015-01-07 18:01:23 4

我需要在10分钟的常规时间序列中重新采样,如下所示:

    time values
1   2015-01-07 11:01:00  NULL
2   2015-01-07 11:11:00  3
3   2015-01-07 11:21:00  3
4   2015-01-07 11:31:00  3
5   2015-01-07 11:41:00  NULL
...
..  2015-01-07 12:11:00  5
...
..  2015-01-07 17:01:00  5,4
...

处理这种重采样的最有效方法是什么?我还强调了最后一个值为“5,4”的多个事件的可能性,处理它的最佳方法是什么?

谢谢


共1个答案

匿名用户

如果您最终需要与其他DataFrames合并,它可能会使您的生活更容易标准化的时间段总是假设一个间隔从: 00-: 10例如。

在这种情况下,一种可能是将时间跨度数据帧转换为明确列出每个时段的数据帧,然后您可以groupby时间段,然后apply(list)以获得所需的输出。

df['temp_id'] = range(len(df))
df_time = (df[['temp_id', 'start', 'end']].set_index('temp_id').stack()
          .reset_index(level=-1, drop=True).rename('time').to_frame())

df_time = (df_time.groupby('temp_id').apply(lambda x: x.set_index('time')
            .resample('10T').asfreq()).reset_index())
df_time = df_time.merge(df[['value', 'temp_id']]).groupby('time')['value'].apply(list).to_frame()

如果您想要包含没有任何索引的索引,您可以重新索引这个数据帧。

df_time.reindex(pd.date_range(start=df_time.index.min(),
     end=df_time.index.max(), freq='10T'))

#                    value
#2015-01-07 11:10:00   [3]
#2015-01-07 11:20:00   [3]
#2015-01-07 11:30:00   [3]
#2015-01-07 11:40:00   NaN
#2015-01-07 11:50:00   NaN
#...
#2015-01-07 17:40:00  [4, 5]
#2015-01-07 17:50:00  [4, 5]
#2015-01-07 18:00:00  [4, 5]
#2015-01-07 18:10:00     [4]
#...