Python 如果间隔发生在多个存储箱上,如何将时间范围/间隔分离到存储箱中
我有一个数据集,它由记录时间段内发生的事件的开始-结束时间(比如秒)对组成。例如:Python 如果间隔发生在多个存储箱上,如何将时间范围/间隔分离到存储箱中,python,Python,我有一个数据集,它由记录时间段内发生的事件的开始-结束时间(比如秒)对组成。例如: #each tuple includes (start, stop) of the event happening data = [(0, 1), (5,8), (14,21), (29,30)] data = [(0, 1), (3, 8)] bin_times(data, 3, 9) // => [33.3, 100.0, 66.6] 我想量化这件事在我想要的任何大小的垃圾箱中发生的时间百分比。例如
#each tuple includes (start, stop) of the event happening
data = [(0, 1), (5,8), (14,21), (29,30)]
data = [(0, 1), (3, 8)]
bin_times(data, 3, 9)
// => [33.3, 100.0, 66.6]
我想量化这件事在我想要的任何大小的垃圾箱中发生的时间百分比。例如,如果我想要每个5秒的垃圾箱,我希望有一个函数:
- 将任何交叉的元组拆分为多个存储箱
- 将事件发生的总时间加起来,除以箱子大小,得到每个箱子发生的时间事件
data = [(0, 1), (5,8), (15,21), (29,30)]
bin_times(data, bin_size=5, total_length=40)
>> [20, 60, 0, 100, 20, 20, 0, 0]
如果您不介意使用
numpy
,这里有一个策略:
import numpy as np
def bin_times(data, bin_size, total_length):
times = np.zeros(total_length, dtype=np.bool)
for start, stop in data:
times[start:stop] = True
binned = 100 * np.average(times.reshape(-1, bin_size), axis=1)
return binned.tolist()
data = [(0, 1), (5,8), (15,21), (29,30)]
bin_times(data, 5, 40)
// => [20.0, 60.0, 0.0, 100.0, 20.0, 20.0, 0.0, 0.0]
为了解释bin_times()
的逻辑,让我使用一个较小的示例:
#each tuple includes (start, stop) of the event happening
data = [(0, 1), (5,8), (14,21), (29,30)]
data = [(0, 1), (3, 8)]
bin_times(data, 3, 9)
// => [33.3, 100.0, 66.6]
times
数组对事件是否在每个单位时间间隔内发生进行编码。首先,将每个条目设置为False
:
[False, False, False, False, False, False, False, False, False]
数据
,并将相应的条目设置为True
:
[True, False, False, True, True, True, True, True, False]
bin\u size
:
[[True, False, False],
[True, True, True],
[True, True, False]]
[0.333, 1.000, 0.666]
[33.3, 100.0, 66.6]
numpy
的使用,请使用.tolist()
方法将生成的numpy
数组转换为普通Python列表需要注意的是:
bin\u size
需要平均分割总长度
-否则,重塑将抛出一个值错误
。不应该(15-21)是(15,21),也就是说,用逗号?很抱歉,是的,刚刚修复了它。无需担心,有助于理解。