如何在python中找到时间序列数据的分钟平均值?

时间:2017-04-18 21:09:02

标签: 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库?

2 个答案:

答案 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 :(得分: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)