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, 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/

相关文章:

python - 将理解列表打印为字符串

python - 所有子图的全局图例

python - Python 新手 - 检查字符串上的用户输入返回错误不起作用

python - 如何让Mypy意识到在某些情况下不会使用默认值

python - 如何将数据从 TCP Python 服务器发送到客户端,反之亦然?

python - PIL zip jpeg 解码器在运行时不工作,但在安装/自测试时工作

python - 无法在 Windows 8.1 上安装 python-poppler-qt5

python - 按类查找跨度并提取其内容

python - 在 python 脚本中使用 utf-8 文件名时出错

python - 使用 Numpy 进行外减法