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

时间:2011-01-19 14:01:32

标签: python

我有一个循环泵,我检查它是打开还是关闭,这不是任何固定的时间间隔。对于一天可以给我一个看起来像这样的数据集,其中'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

1 个答案:

答案 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中效率不高。