我有一个时间信号(37913毫秒到40010),我想在每20毫秒的间隙中拆分它。
例如前20毫秒:
for t in time:
if t>=37913 and t< 37933:
list1.append(t)
这为我提供了[37913.496549, 37916.878267, 37918.506757]
列表。
我想在每20毫秒的差距上制作几个不同的列表。我知道它应该非常简单但不知何故我想不出解决方案。
**** ****已编辑
所以为了进一步解释我的观点,我实际想要实现的是,有一个传入的加速度(没有上限时间)信号(绿色条)我想检查这些是否传入样品的范围为0-20毫秒,10-30毫秒或20-40毫秒,依此类推。如果它们处于这样的间隔,那么我必须使用此数据近似点(黑点)。例如,如果当前值介于0-20 ms之间,那么我可以通过某种近似使用所有这些值来近似10 ms处的值(假设在10 ms时没有当前值)。近似方法现在并不重要,我只想捕获这些值
所有的帮助或建议都得到了所有人的高度赞赏。
答案 0 :(得分:1)
如果您的时间戳列表已排序:
from itertools import groupby
sample = range(100)
INTERVAL_SIZE = 20
key = lambda x: x // INTERVAL_SIZE
list(list(v) for k, v in groupby(sample, key=key))
会给你:
[
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
]
如果未排序,请在使用key
之前添加排序(groupby
),因为它需要排序的可迭代。
答案 1 :(得分:1)
这是我认为做你想做的事情。为了测试它,我必须创建一些示例输入数据,因为你的问题中没有任何内容 - 这是在片段的最开始发生的事情。
对于每个时间间隔,它会创建一个单独的“桶”,其中包含时间范围内的相应时间值。 注意由于时间间隔范围重叠,某些时间值可能最终会放在两个存储桶中。
from pprint import pprint
import random
random.seed(42) # Create same "random" sequence each run for testing.
# First create some test data.
INTERVAL = 0.02 # 20 ms
start = 37913
times = []
nvalues = 2, 3, 4, 2, 1 # Number of values in each interval.
for i, nvalue in enumerate(nvalues):
lowerbounds = start + i*INTERVAL
upperbounds = start + (i+1)*INTERVAL
for _ in range(nvalue):
times.append(random.uniform(lowerbounds, upperbounds))
print('There are {} time values:'.format(len(times)))
times.sort() # Put into ascending order.
pprint(times)
#=======
# Split the times up into "buckets" of values depending on their range.
HALF_INTERVAL = INTERVAL / 2
brackets = []
print()
print('Time brackets:')
st = int(min(times))
for i in range(4):
begin = round(st + i*HALF_INTERVAL, 6)
end = round(begin + INTERVAL, 6)
brackets.append((begin, end))
print(' ', begin, end)
buckets = [[] for _ in range(len(brackets))] # Create empty buckets.
for t in times: # Put each time in the cooresponding bucket of times.
for i, (begin, end) in enumerate(brackets):
if begin <= t <= end:
buckets[i].append(t)
print()
print('Stored in corresponding interval bucket:')
for i, bracket in enumerate(brackets):
print('bucket[{}]: range: {!r}, values: {}'.format(
i, bracket, buckets[i]))
示例输出:
There are 12 time values:
[37913.0005002151,
37913.01278853597,
37913.02446421476,
37913.025500586366,
37913.03472942428,
37913.04173877665,
37913.048438436395,
37913.05353398975,
37913.05784359135,
37913.060595944386,
37913.064372759494,
37913.09010710576]
Time brackets:
37913.0 37913.02
37913.01 37913.03
37913.02 37913.04
37913.03 37913.05
Stored in corresponding interval bucket:
bucket[0]: range: (37913.0, 37913.02), values: [37913.0005002151, 37913.01278853597]
bucket[1]: range: (37913.01, 37913.03), values: [37913.01278853597, 37913.02446421476, 37913.025500586366]
bucket[2]: range: (37913.02, 37913.04), values: [37913.02446421476, 37913.025500586366, 37913.03472942428]
bucket[3]: range: (37913.03, 37913.05), values: [37913.03472942428, 37913.04173877665, 37913.048438436395]
答案 2 :(得分:0)
我会建议这种方法:
arrs = []
while len(arr) > 20:
pice = arr[:20]
arrs.append(pice)
arr = arr[20:]
arrs.append(arr)
你可以用它来制作功能,每当你调用它时就会给你一块。
答案 3 :(得分:0)
如果我理解你的问题,你可以使用范围:
$text = str_replace('1,300', '1,600', $text);
输出:
r=range(37913,40010,20)
答案 4 :(得分:0)
如果您不介意使用numpy
,可以试试这个:
import numpy as np
#a = np.arange(37913,40010+1,1)
a = np.arange(0,10+1,1) # comment this and uncomment above for your case
nlen = 2
parts = np.array_split(a,int(np.ceil(len(a) / nlen)))
print("a = {}".format(a)) # [ 0 1 2 3 4 5 6 7 8 9 10]
print("len(a) = {}".format(len(a))) # 11
print("parts[0] = {}".format(parts[0])) # [0 1]
print("parts[-1] = {}".format(parts[-1])) # [10]
如果您只想将整个数组分成n个部分,请执行以下操作:
nparts = 6
np.array_split(a,nparts)