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

如何使用python从状态和时间计算运行时间,python,Python,我有一个循环泵,我检查它是开着还是关着,这不是任何固定的时间间隔。在一天中,这可能会给我一个类似这样的数据集,其中“值”表示泵的开或关 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,

我有一个循环泵,我检查它是开着还是关着,这不是任何固定的时间间隔。在一天中,这可能会给我一个类似这样的数据集,其中“值”表示泵的开或关

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)})
格式没有那么重要,可以更改

我想知道的是如何计算
的“值”
为0或1(或开或关)的分钟数(或时间跨度或其他值)

这只是一个小样本的数据,它跨越了几年,所以可能有很多。 我一直在使用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中不会特别有效。

它在2011-01-18 07:58:25关闭,在2011-01-18 08:00:03打开。但是它在这两个瞬间之间的状态是什么呢?值始终是条目所说的值,直到它改变为止。所以对于这两个,在8:00:03之前是0,之后在8:32:10之前是1,然后又是off…这是实际的总数吗?还是只是个例子?只是个例子。。。只是做了实际的。。。0=05:32:10 1=06:44:20值为1的最后一个条目无法计算,我可以简单地删除它。您的示例将给出自上次更改以来的时间。@birchroad:我认为输出非常清楚地表明情况并非如此。在阅读了您的评论之后,我的示例似乎可以根据您的要求进行更改。你对这个微不足道的变化有意见吗?我喜欢我所看到的。不幸的是,我坚持使用py2k,但我将运行一些测试,看看它是否“足够快”@birchroad:如果你坚持使用py2k,请使用
itertools.izip
sums.iteritems
,而不是
zip
sums.items
,这些都是微小的优化(尤其是
items
items)。我在回答中提到的
groupby
优化对这两个版本的python都是有益的。是否是,将取决于实际数据。