2011-01-19 40 views
5

Tôi có một máy bơm tuần hoàn mà tôi kiểm tra với nó bật hoặc tắt và điều này không phải do bất kỳ khoảng thời gian cố định nào. Trong một ngày có thể cung cấp cho tôi một tập dữ liệu trông như thế này, nơi 'giá trị' đại diện cho máy bơm đang bật hoặc tắt.Cách tính toán thời gian chạy từ trạng thái và thời gian sử dụng 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)}) 

Định dạng không quan trọng và có thể thay đổi.

Điều tôi muốn biết là cách tính số phút (hoặc số lần hoặc bất kỳ số nào) số 'value' là 0 hoặc 1 (hoặc BẬT hoặc TẮT)?

Đây chỉ là một mẫu nhỏ dữ liệu, nó trải dài qua nhiều năm để có thể có rất nhiều. Tôi đã sử dụng numpy/mathplotlib để vẽ sơ đồ một số đồ thị và có thể có điều gì đó khó khăn để làm điều này nhưng tôi không đủ tốt ở đó.

Sửa

Những gì tôi muốn nhìn thấy như một đầu ra để đây sẽ là một số tiền lớn thời gian ở các bang khác nhau. Một cái gì đó như ...

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

Đã tắt vào 2011-01-18 07:58:25 và vào ngày 2011-01-18 08:00:03. Nhưng trạng thái của nó giữa hai phiên bản này là gì? – eumiro

+0

giá trị luôn là mục nhập cho biết cho đến khi nó thay đổi. Vì vậy, đối với hai nó là 0 cho đến 8:00:03 sau đó nó là 1 cho đến 8:32:10 và sau đó tắt một lần nữa .... – kmpm

+0

là khoản tiền thực tế này? hoặc nó chỉ là một ví dụ? – SilentGhost

Trả lời

2

Nó thực sự phụ thuộc vào cách bạn sẽ xử lý điểm dữ liệu này, chúng đại diện cho những gì? Nói chung, để biết khi chuyển đổi xảy ra bạn có thể sử dụng itertools.groupby như thế này:

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

Đây là ví dụ về thời gian tối thiểu bạn có thể chắc chắn hệ thống của bạn là lên hoặc xuống (giả sử không có sự gián đoạn giữa đo lường).

Khi bạn quyết định cách xử lý điểm của mình, việc sửa đổi thuật toán này sẽ không đáng kể.


EDIT: vì bạn chỉ cần số tiền lên/xuống theo thời gian, đây là phiên bản đơn giản hơn:

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

Nếu bạn mong đợi dài giai đoạn liên tục lên/xuống theo thời gian, bạn vẫn có thể hưởng lợi từ số itertools.groupby. Đây là phiên bản py3k, vì vậy nó sẽ không đặc biệt hiệu quả trong py2k.

+0

Ví dụ của bạn sẽ cho tôi thời gian kể từ lần thay đổi trước đó. – kmpm

+0

@birchroad: Tôi nghĩ rằng đầu ra thể hiện khá rõ ràng rằng đó không phải là trường hợp. Có đọc bình luận của bạn, có vẻ như, ví dụ của tôi có thể được thay đổi để phù hợp với yêu cầu của bạn. Bạn có vấn đề với sự thay đổi tầm thường này không? – SilentGhost

+0

Tôi có thể sửa chữa ... – kmpm

Các vấn đề liên quan