2011-01-19 5 views
5

순환 펌프가 켜져 있거나 꺼져 있는지 확인합니다. 이는 고정 간격으로 이루어지지 않습니다. 단 하나의 날 동안 나는 '값'이 펌프가 켜지거나 꺼지는 것을 나타내는 곳에서 이런 식으로 보이는 데이터 세트를 줄 수 있습니다.파이썬을 사용하여 상태와 시간에서 실행 시간을 계산하는 방법

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

2011-01-18 07:58:25에 켜져 있었고 2011-01-18에 08:00:03에있었습니다. 그러나이 두 순간 사이의 상태는 어떠 했습니까? – eumiro

+0

값은 항상 항목이 변경 될 때까지 표시됩니다. 그래서이 두 가지 경우 0 시까 지 8시 30 분 3 초가 지났을 때 1시 8시 32 분 10 초 그리고 다시 꺼집니다 .... – kmpm

+0

이 실제 합계입니까? 아니면 그냥 예입니까? – SilentGhost

답변

2

정말이 데이터 포인트를 어떻게 처리 할 것인가에 달려 있습니다.

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

이것은 (측정 사이에 중단 없다고 가정) 당신은 당신의 시스템이 위 또는 아래로했다 확신 할 수 있습니다 최소한의 시간의 예는 다음과 같습니다 스위치가이 같은 itertools.groupby을 사용할 수 발생했을 때 일반적으로 알고.

포인트를 처리하는 방법을 결정하면이 알고리즘을 수정하는 것이 쉽습니다.


편집 : 당신은 업/다운 시간의 합계를 필요로하기 때문에, 여기에 간단한 버전입니다 :

>>> 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에서는 특히 효율적이지 않습니다.

+0

를 드롭 할 수 귀하의 모범은 이전의 변화 이후로 나에게 시간을 줄 것입니다. – kmpm

+0

@birchroad : 출력이 매우 틀림 없다는 것을 분명히 보여줄 것이라고 생각합니다. 귀하의 의견을 읽은 것 같습니다, 내 예를 귀하의 요구 사항을 수용하기 위해 변경할 수 있습니다. 이 사소한 변화에 문제가 있습니까? – SilentGhost

+0

나는 그걸 고칠 수있을거야. – kmpm

관련 문제