如何使用Python从状态和时间计算运行时间

5

我有一个循环泵,需要检查它是否开启或关闭,这并没有固定的时间间隔。对于一天来说,这可能会给我一个类似以下数据集的数据,其中'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(或ON或OFF)的分钟数(或时间跨度或其他内容)?

这只是数据的一小部分,它跨越了几年,所以可能会有很多。我已经使用numpy/mathplotlib绘制了一些图表,并且可能有一些在numpy中完成此操作的方法,但我对此还不够熟练。

编辑

我希望看到的输出是不同状态下的时间总和。类似于...

0 04:42:13  
1 07:34:17

它在2011年01月18日07:58:25关闭,于2011年01月18日08:00:03打开。但是在这两个瞬间之间它的状态是什么? - eumiro
该值始终是条目所说的,直到它改变。因此,对于这两个条目,在8:00:03之前它为0,在那之后它为1,在8:32:10之后再次关闭... - kmpm
这些是实际的总数吗?还是只是一个例子? - SilentGhost
0=05:32:101=06:44:20 - kmpm
最后一个值为1的条目无法计算,我可以简单地删除它。 - kmpm
1个回答

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 中效率不会特别高。


你的例子会给我自上次更改以来的时间。 - kmpm
@birchroad:我认为输出结果很清楚地表明这并不是情况。看完你的评论,我的例子似乎可以被修改以适应你的要求。你对这个微不足道的改变有问题吗? - SilentGhost
我喜欢我所看到的。不幸的是,我被困在py2k中,但我会运行一些测试,看看它是否“足够快”。 - kmpm
@birchroad:如果你被py2k困住了,使用 itertools.izipsums.iteritems,而不是 zipsums.items,这些是微小的优化(尤其是 items)。我在答案中提到的 groupby 优化对于Python的两个版本都有好处。它是否有益将取决于实际数据。 - SilentGhost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接