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秒的垃圾箱,我希望有一个函数:

  • 将任何交叉的元组拆分为多个存储箱
  • 将事件发生的总时间加起来,除以箱子大小,得到每个箱子发生的时间事件
我在第一点上遇到了很多麻烦

理想情况下,它看起来像这样,其中bin_times是我需要帮助编写的函数,而输出是函数将返回的内容:

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]
    
  • 乘以100将这些数字转换为百分比:

    [33.3, 100.0, 66.6]
    
  • 要对函数的使用者隐藏
    numpy
    的使用,请使用
    .tolist()
    方法将生成的
    numpy
    数组转换为普通Python列表


  • 需要注意的是:
    bin\u size
    需要平均分割
    总长度
    -否则,重塑将抛出一个
    值错误

    不应该(15-21)是(15,21),也就是说,用逗号?很抱歉,是的,刚刚修复了它。无需担心,有助于理解。