我有一个循环泵,我检查它是打开还是关闭,这不是任何固定的时间间隔。对于一天可以给我一个看起来像这样的数据集,其中'value'表示泵打开或关闭。
data=(
{'value': 0, 'time': datetime.datetime(2011, 1, 18, 7, 58, 25)},
{'value': 1, 'time': datetime.datetime(2011, 1, 18, 8, 0, 3)},
{'value': 0, 'time': datetime.datetime(2011, 1, 18, 8, 32, 10)},
{'value': 0, 'time': datetime.datetime(2011, 1, 18, 9, 22, 7)},
{'value': 1, 'time': datetime.datetime(2011, 1, 18, 9, 30, 58)},
{'value': 1, 'time': datetime.datetime(2011, 1, 18, 12, 2, 23)},
{'value': 0, 'time': datetime.datetime(2011, 1, 18, 15, 43, 11)},
{'value': 1, 'time': datetime.datetime(2011, 1, 18, 20, 14, 55)})
格式并不重要,可以更改。
我想知道的是如何计算'value'
为0或1(或开启或关闭)的分钟数(或时间跨度等)?
这只是数据的一小部分,它延续了几年,所以可能会有很多。 我一直在使用numpy / mathplotlib来绘制一些图形,并且可能有一些东西在numpy中这样做但是我不够好。
修改
我希望看到的输出是不同状态下的时间总和。有点像...
0 04:42:13
1 07:34:17
答案 0 :(得分:2)
这真的取决于你将如何对待这些数据点,它们代表什么?通常,要知道切换何时发生,您可以使用itertools.groupby
,如下所示:
>>> from itertools import groupby
>>> for i, grp in groupby(data, key=lambda x: x['value']):
lst = [x['time'] for x in grp]
print(i, max(lst) - min(lst))
0 0:00:00
1 0:00:00
0 0:49:57
1 2:31:25
0 0:00:00
1 0:00:00
这是您可以确定系统启动或关闭的最短时间示例(假设测量之间没有中断)。
一旦你决定如何对待你的分数,修改这个算法将是微不足道的。
编辑:由于您只需要上/下时间的总和,以下是更简单的版本:
>>> sums = {0:datetime.timedelta(0), 1:datetime.timedelta(0)}
>>> for cur, nex in zip(data, data[1:]):
sums[cur['value']] += nex['time'] - cur['time']
>>> for i, j in sums.items():
print(i, j)
0 5:32:10
1 6:44:20
如果您期望长时间的连续上/下时间,您可能仍会受益于itertools.groupby
。这是py3k版本,因此在py2k中效率不高。