我有一个循环泵,我会检查它是打开还是关闭,这不是任何固定的时间间隔。有一天可能会给我一个看起来像这样的数据集,其中“值”代表泵的开启或关闭。
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(或 ON 或 OFF)多少分钟(或时间跨度或其他)?
这只是数据的一小部分样本,它跨越了数年,因此可能会有很多。 我一直在使用 numpy/mathplotlib 绘制一些图表,numpy 中可能有一些东西可以做到这一点,但我还不够好。
编辑
我希望看到的输出是不同状态下的时间总和。像...
0 04:42:13
1 07:34:17
最佳答案
这实际上取决于您将如何处理这些数据点,它们代表什么?通常,要知道何时发生切换,您可以像这样使用 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中效率不是特别高。
关于python - 如何使用python从状态和时间计算运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4736079/