如果在多个箱子上发生间隔,如何将时间范围/间隔分成箱子

时间:2016-09-26 18:54:05

标签: python

我有一个数据集,其中包含一段记录时间内发生的事情的起始时间(比如几秒)。例如:

#each tuple includes (start, stop) of the event happening
data = [(0, 1), (5,8), (14,21), (29,30)]

我想量化这件事在我想要的任何尺寸的箱子里发生的时间百分比。例如,如果我想要每个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]

1 个答案:

答案 0 :(得分:1)

如果你不介意使用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()的逻辑,让我使用一个较小的例子:

data = [(0, 1), (3, 8)]
bin_times(data, 3, 9)
// => [33.3, 100.0, 66.6]
  1. times数组编码您的事件是否在每个单位时间间隔内发生。首先将每个条目设置为False

    [False, False, False, False, False, False, False, False, False]
    
  2. 阅读传入的data并将相应的条目转为True

    [True, False, False, True, True, True, True, True, False]
    
  3. 将其重塑为二维矩阵,其中行的长度为bin_size

    [[True, False, False],
     [True,  True,  True],
     [True,  True, False]]
    
  4. 取每行的平均值:

    [0.333, 1.000, 0.666]
    
  5. 乘以100将这些数字转换为百分比:

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

  7. 有一点需要注意:bin_size需要均匀划分total_length - 否则重塑会抛出ValueError