将事件和持续时间的时间序列重采样为并发事件
我有两列数据:一个是事件开始的时间,另一个是事件持续的时间。就像这样:
time, duration
1:22:51,41
1:56:29,36
2:02:06,12
2:32:37,38
2:34:51,24
3:24:07,31
3:28:47,59
3:31:19,32
3:42:52,37
3:57:04,58
4:21:55,23
4:40:28,17
4:52:39,51
4:54:48,26
5:17:06,46
6:08:12,1
6:21:34,12
6:22:48,24
7:04:22,1
7:06:28,46
7:19:12,51
7:19:19,4
7:22:27,27
7:32:25,53
我想创建一个折线图,显示一天中同时发生的事件数量。把时间改成 start_time
,然后再加一列计算 end_time
的数据,这个步骤比较简单(假设这是下一步)——我不太明白的是,之后我该如何重新整理这些数据,以便能够绘制出同时发生事件的图表。
我想最终得到的结果是这样的(不过是按分钟分组的):
time, events
1:30:00,1
2:00:00,2
2:30:00,1
3:00:00,1
3:30:00,2
2 个回答
2
你可以创建一个包含字典项的列表,字典里有“时间”和“事件”这两个值。
显然,你需要以不同的方式来处理和操作时间数据类型,但你可以这样做:
event_bucket = []
time_interval = (end_time - start_time) / num_of_buckets
for ii in range(num_of_buckets):
event_bucket.append({"time":start_time + ii*time_interval,"events":0})
for entry in time_entry:
for bucket in event_bucket:
if bucket["time"] >= entry["start_time"] and bucket["time"] <= entry["end_time"]:
bucket["events"] += 1
如果你把 num_of_buckets
的值调大,图表就会变得更精确。
6
首先,把它变成一个真正的时间戳:
df['time'] = pd.to_datetime('2014-03-14 ' + df['time'])
现在你可以获取结束时间了:
df['end_time'] = df['time'] + df['duration'] * pd.offsets.Minute(1)
获取开放事件的一种方法是把开始时间和结束时间结合起来,然后重新取样和计算累积和:
In [11]: open = pd.concat([pd.Series(1, df.time), # created add 1
pd.Series(-1, df.end_time) # closed substract 1
]).resample('30Min', how='sum').cumsum()
In [12]: open
Out[12]:
2014-03-14 01:00:00 1
2014-03-14 01:30:00 2
2014-03-14 02:00:00 1
2014-03-14 02:30:00 1
2014-03-14 03:00:00 2
2014-03-14 03:30:00 4
2014-03-14 04:00:00 2
2014-03-14 04:30:00 2
2014-03-14 05:00:00 2
2014-03-14 05:30:00 1
2014-03-14 06:00:00 2
2014-03-14 06:30:00 0
2014-03-14 07:00:00 3
2014-03-14 07:30:00 2
2014-03-14 08:00:00 0
Freq: 30T, dtype: int64