2017-04-18 216 views
0

我有元組的陣列,像這樣:如何從python的時間序列數據中找到分鐘平均值?

timeseries_array = [ 
    (datetime.datetime(2017, 4, 18, 16, 57, 21, 888778), 10), 
    (datetime.datetime(2017, 4, 18, 16, 57, 35, 712351), 36), 
    (datetime.datetime(2017, 4, 18, 16, 57, 46, 831850), 70), 
    (datetime.datetime(2017, 4, 18, 16, 58, 0, 255499), 52), 
    (datetime.datetime(2017, 4, 18, 16, 58, 11, 138477), 34), 
    (datetime.datetime(2017, 4, 18, 16, 58, 22, 902610), 44), 
    (datetime.datetime(2017, 4, 18, 16, 58, 38, 206132), 106), 
    (datetime.datetime(2017, 4, 18, 16, 58, 53, 624415), 81), 
    (datetime.datetime(2017, 4, 18, 16, 59, 6, 301157), 56), 
] 

每個元組是一個(日期,值)。

一旦我們增加新的數據到這個陣列,它是一個新的記錄數據,我想看看最後兩分鐘,並比較他們的數據的平均值。

所以在這個例子中,一旦我們增加了59分鐘的數據,我想找到內分58和57分鐘找到的數據的平均值,並比較兩者。

分57平均是38.7和58分鐘平均是63.4。

最好的方法是什麼?也許有一個我應該使用的Python庫?

+0

你是什麼意思的平均?無法確切日期加時間對象 –

+0

@DmitryPolonskiy,你可以在tuple.The在列表中位置平均的第二個值最後兩個項目'(,)[1]''是和81''56' – Jon

+0

@喬恩我沒有意識到這就是我們的平均水平。 –

回答

1

下面是做到這一點的一種方法:

from __future__ import division 

def timeseries_averages(timeseries_array): 
    unique_minutes = set(m[0].minute for m in timeseries_array) 
    for v in unique_minutes: 
     print 'The average of the {} minute value is {}'.format(v, sum([m[1] for m in timeseries_array if m[0].minute == v])/len([m[1] for m in timeseries_array if m[0].minute == v])) 

The average of the 57 minute value is 38.6666666667 
The average of the 58 minute value is 63.4 
The average of the 59 minute value is 56.0 
1

這是[itertools.groupby]一個完美的應用[1]。當您將值添加到列表中時,請保持您已經看到的幾分鐘的「高水位標記」。當新的分鐘值到達時,使用groupby僅處理列表的最後部分(索引大於高水位標記)以將列表分成塊。在每個塊上計算任何你想要的。

import datetime 
import itertools 

timeseries_array = [] 
timeseries_mark = len(timeseries_array) 
last_minute = 57 

for new_value in [ 
    (datetime.datetime(2017, 4, 18, 16, 57, 21, 888778), 10), 
    (datetime.datetime(2017, 4, 18, 16, 57, 35, 712351), 36), 
    (datetime.datetime(2017, 4, 18, 16, 57, 46, 831850), 70), 
    (datetime.datetime(2017, 4, 18, 16, 58, 0, 255499), 52), 
    (datetime.datetime(2017, 4, 18, 16, 58, 11, 138477), 34), 
    (datetime.datetime(2017, 4, 18, 16, 58, 22, 902610), 44), 
    (datetime.datetime(2017, 4, 18, 16, 58, 38, 206132), 106), 
    (datetime.datetime(2017, 4, 18, 16, 58, 53, 624415), 81), 
    (datetime.datetime(2017, 4, 18, 16, 59, 6, 301157), 56), 
    # Minute 00 
    (datetime.datetime(2017, 4, 18, 17, 00, 1, 000), 33), 
]: 

    minute = new_value[0].minute 
    if minute != last_minute: 
     tail = timeseries_array[timeseries_mark:] 
     advance = None 
     for m, group in itertools.groupby(tail, key=lambda tpl: tpl[0].minute): 
      values = list(group) 
      total = sum([tpl[1] for tpl in values]) 
      avg = total/len(values) 
      print("Average at minute {} is {}".format(m, avg)) 
      if advance is None: 
       advance = len(values) 

     if advance is None: 
      print("Advance is none. Why?") 
     else: 
      timeseries_mark += advance 

     last_minute = minute 

    timeseries_array.append(new_value) 
相關問題