2016-02-09 56 views
0

我認爲問題的定義非常簡單,但我正在尋找適合於非常大型數據集(20億以上)的解決方案。Python:將時間序列數據平均到給定時間段的箱子中

我有兩個列表:stamps包含N時間戳和values包含N標量值。

我可以很容易地繪製這些數據有時間序列圖。

現在我想將values的平均值放入1分鐘長的箱子中(我通常每分鐘有50個值,但有些是空的)。空值導致空箱應該使該箱的平均值等於零。

我怎樣纔能有效地做到這一點與最少的代碼?

+0

我會嘗試在問題儘快發佈初始部分解決方案。 –

+0

你想用空值完成什麼?將它們視爲0,仍然平均超過50?或平均超過(數量每個bin - 空數量)? – Simon

+0

空值導致空箱應該使該箱的平均值等於零。 –

回答

1
minute_bins = {} 
averages = {} 

for i in range(len(values)): 

    # Integer division 
    minute = stamps[i] // 60 

    if minute in minute_bins: 
     minute_bins[minute].append(values[i]) 
    else: 
     minute_bins[minute] = [values[i]] 

for key in minute_bins: 
    minute_values = minute_bins[key] 
    averages[key] = float(sum(minute_values))/len(minute_values) 

假設你有一個數字形式的時間戳。我使用time.time()來測試我的代碼,但任何兩個時間戳間隔相差1秒的格式都應該這樣做。

+0

我有我的時間戳作爲'datetime.datetime'對象,所以'stamp.timestamp()'應該做的。非常感謝! –

0

塞德里克。由於您的數據集非常大,我認爲您需要一個解決方案,不需要將所有值讀入列表中,然後再對其進行平均。我會使用一個簡單的平均值的類,計算平均運行,是這樣的:

import collections 

class averager(object): 
    def __init__(self): 
     self.avg = 0 
     self.n = 0 
    def add(self, x): 
     self.avg = ((self.avg * self.n) + x)/(self.n + 1) 
     self.n += 1 

d = collections.defaultdict(averager) 

for timestamp, value in zip(stamps, values): 
    d[timestamp // 60].add(value) 

for k in sorted(list(d.keys())): 
    print(k, d[k].avg, sep="\t") 

你的問題似乎也適合於並行處理 - 分割你的數據集成塊,計算並行運行的每個塊的平均值,然後將平均值平均在一起。

希望這會有所幫助。