从CSV数据获取延迟时间

时间:2012-10-30 11:03:40

标签: python numpy scipy scientific-computing

我正在测量并行端口上生成的信号的稳定性。

我们从示波器生成的CSV文件中导入了numpy数组。以下输出是用于显示问题的剥离变体:

import numpy as np
data = np.array([0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0])

t = np.array([0.    ,0.0005, 0.001 ,0.0015,
     0.002 ,0.0025, 0.003 ,0.0035,
     0.004 ,0.0045, 0.005 ,0.0055,
     0.006 ,0.0065, 0.007 ,0.0075,
     0.008 ])

绘制时看起来像这样。 enter image description here

我正在寻找最简洁的方法来将冲动的持续时间作为列表中的值。

写完之后,我会尝试从头开始自己实现解决方案,我希望的是获得持久时间的首选方式,也许有一个我不知道的那个numpy函数?

4 个答案:

答案 0 :(得分:1)

假设输入信号被去抖动,你可以循环遍历数组。

high_times = []

low_high = 0

for i in xrange(len(t) - 1):
    if data[i] == 0 and data[i+1] == 1:
        low_high = i
    elif data[i] == 1 and data[i+1] == 0:
        high_times.append(t[i] - t[low_high])

high_times是每个脉冲信号耗尽的时间列表。

答案 1 :(得分:1)

假设data01的int数组:

1。)这定义了从上一个0到最后1的脉冲持续时间:

import numpy as np

idx = t[np.abs(np.diff(data)) == 1]
lasting_times = idx[1::2] - idx[::2]

2。)如果您更喜欢从第一个1到最后一个1的持久时间定义:

diff = np.diff(data)
lasting_times = t[diff == -1] - t[1:][diff == 1]

注意: 无论如何,您必须处理数据的末尾,即这些解决方案假设data0开头和结尾...

答案 2 :(得分:0)

假设您的数据列表仅包含1和0:

print [(m.start(),m.end()) for m in re.finditer('1+', '0000111100001111')]

输出

 [(4, 8), (12, 16)]

答案 3 :(得分:0)

使用itertools模块中的groupby,您可以非常轻松地完成。

from itertools import groupby
#union of the point with duration of the point
val_dt = zip(data[:-1],t[:-1]-t[1:])
#groupby to unite similar values
steps = [ (g[0],sum( h[1] for h in g[1])) for g in groupby(val_dt,lambda s:s[0])]
print steps
#[(0, -0.002), (1, -0.002), (0, -0.002), (1, -0.002)]

从内存管理的角度来看,这种方法并不完美,但它有效。