Pandas事件数据帧(开始停止)到常规时间序列

时间:2018-04-08 01:13:03

标签: python pandas time-series

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

看起来像这样:

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 个答案:

答案 0 :(得分: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]
#...