我正在处理一个事件数据集。每行都有一个开始时间、一个结束时间和一个值。
它看起来像这个:
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”的多个事件的可能性,处理它的最佳方法是什么?
谢谢
如果您最终需要与其他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]
#...