2011-01-19 17 views
5

Tengo una bomba de circulación que verifico si está encendida o apagada y esto no es por intervalos fijos nunca más. Para un solo día, podría darme un conjunto de datos como este, donde "valor" representa que la bomba está encendida o apagada.Cómo calcular el tiempo de ejecución desde el estado y la hora usando 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)}) 

El formato no es tan importante y se puede cambiar.

Lo que sí quiero saber es cómo calcular cuántos minutos (o intervalo de tiempo o lo que sea) el 'value' ha sido 0 o 1 (¿ON u OFF)?

Esto es solo una pequeña muestra de los datos, se extiende durante varios años por lo que podría haber muchos. He estado usando numpy/mathplotlib para trazar algunos gráficos y podría haber algo en numpy para hacer esto pero no soy lo suficientemente bueno en eso.

Editar

Lo que me gustaría ver como una salida a esta sería una suma del tiempo en los diferentes estados. Algo así como ...

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

Fue apagado el 2011-01-18 07:58:25 y encendido el 18-01-2011 08:00:03. Pero, ¿cuál era su estado entre estos dos instantes? – eumiro

+0

el valor siempre es lo que dice la entrada hasta que cambie. Entonces, para estos dos fue 0 hasta las 8:00:03 después de que fueron 1 hasta las 8:32:10 y luego se apagaron nuevamente ... – kmpm

+0

¿son estas sumas reales? o es solo un ejemplo? – SilentGhost

Respuesta

2

Realmente depende de cómo va a tratar estos puntos de datos, ¿son representativos de qué? En general, para saber cuando el interruptor se producen podría utilizar itertools.groupby así:

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

Este es el ejemplo de un mínimo de tiempo puede estar seguro de que su sistema era arriba o hacia abajo (suponiendo que no haya interrupciones entre la medición).

Una vez que decida cómo tratar sus puntos, la modificación de este algoritmo sería trivial.


EDITAR: ya que sólo necesita sumas de arriba/abajo-tiempo, aquí es la versión más simple:

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

Si esperar a largo períodos de actualización continua/tiempo de inactividad, aún puede beneficiarse del itertools.groupby. Esta es la versión py3k, por lo que no será particularmente eficiente en py2k.

+0

Su ejemplo me daría el tiempo desde el cambio anterior. – kmpm

+0

@birchroad: Creo que el resultado demuestra claramente que ese no es el caso. Después de leer su comentario, parece que mi ejemplo podría cambiarse para cumplir con su requisito. ¿Tienes problemas con este cambio trivial? – SilentGhost

+0

Probablemente podría arreglar eso ... – kmpm

Cuestiones relacionadas