我有一个时间序列,代表了对系统功能的常规查询,其中 1 = 正常工作
而 0 = 不正常工作
。例如,将时间序列表示为列表:
U = [0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0]
我对计算类似于故障平均时间(系统运行时间)和修复平均时间(系统停机时间)以及其他类似统计数据感兴趣,所以我想做的是计算连续的1
和0
条目。我想剪去开头和结尾的组合,因为对于以上示例,我不知道系统最初何时停机,也不知道未来它何时会重新启动。因此,在这种情况下,我要生成的输出将是:
uptime = [6, 4, 9, 2] # 6 ones followed by zeros, then 4 ones followed by zeros, etc.
downtime = [3, 3, 2] # like uptime but ignoring zeros at indices [0,1] and [-1]
我写了一个脚本来做这个,但它似乎有点笨拙,我想知道是否有更好的、更符合 Python 风格的方法来完成。以下是我的代码。
def count_times(U, down=False):
if down:
U = [1 - u for u in U]
T = []
# Skip the first entry as you don't know when it started
m = U.index(0)
m += U[m:].index(1)
while m < len(U):
try:
T.append(U[m:].index(0))
m += U[m:].index(0)
m += U[m:].index(1)
except ValueError:
# skip the last entry as you don't know when it will end
return T
yielding:
print count_times(U)
# [6, 4, 9, 2]
print count_times(U, down = True)
# [3, 3, 2]
这个方法可以运行,但我不禁想知道是否有更简洁的方式?