如何使用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都是有益的。是否是,将取决于实际数据。