计算并返回列表中的平均值

时间:2014-03-13 17:50:33

标签: python list average

我有一些包含一些值的长列表。我想定义一个函数,该函数获取列表并计算列表中每24个值的平均值,并将平均值作为列表返回。我该怎么做呢?我在列表中有8760个元素,返回的列表应该给出8760/24 = 365个元素。

hourly_temp = ['-0.8', '-0.7', '-0.3', '-0.3', '-0.8',
'-0.5', '-0.7', '-0.6', '-0.7', '-1.2', '-1.7...] #This goes on, it's 8760 elements

def daily_mean_temp(hourly_temp):

    first_24_elements = hourly_temp[:24] #First 24 elements in the list

这是对的吗?我收到一条错误说:TypeError:无法使用灵活类型执行reduce

def daily_mean_temp(hourly_temp):
averages = [float(sum(myrange))/len(myrange) 
        for myrange in zip(*[iter(hourly_temp)]*24)]
return averages

5 个答案:

答案 0 :(得分:2)

假设您想要独立群组,可以使用grouper itertools recipe

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

然后轻松获得每个group的平均值:

averages = [sum(group)/float(len(group)) for group in grouper(data, 24)]

修改:鉴于您的数据似乎是字符串列表,我建议您先使用map转换为浮点数:

data = map(float, hourly_temp)

答案 1 :(得分:1)

averages = [sum( map(float, myrange) )/len(myrange) 
            for myrange in zip(*[iter(my_big_list)]*range_size)]

这是一个非常简洁的方法...请注意,它会截断任何不能被范围大小整除的结束变量

如果你需要在末尾有不均匀的列表(例如,chunk_size为10,big_list为17将剩下7个)

 from itertools import izip_longest as zip2
 averages = [sum(map(float,filter(None,myrange)))/len(filter(None,myrange)) 
            for myrange in zip2(*[iter(my_big_list)]*range_size)]

答案 2 :(得分:1)

假设您的值是字符串,如上所示,并且您有NumPy方便,这应该很快:

import numpy as np
averages = [x.mean() for x in np.array_split(
        [float(x) for x in hourly_temp], 365)]

如果你可能有NaNs:

averages = [x[~np.isnan(x)].mean() for x in np.array_split(
        [float(x) for x in hourly_temp], 365)]

如果你从适当的花车开始:

averages = [x[~np.isnan(x)].mean() for x in np.array_split(hourly_temp, 365)]

答案 3 :(得分:0)

这些方面似乎有效:

[ sum(hourly_temp[i:i+24]) / len(hourly_temp[i:i+24]) for i in xrange(0, len(hourly_temp), 24) ]

答案 4 :(得分:0)

使用this grouper recipe,这很容易(显然,我已经合成了temps列表):

#!/usr/bin/python

import itertools as it

temps = range(96)

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return it.izip_longest(*args, fillvalue=fillvalue)

daily_averages = [sum(x)/len(x) for x in grouper(temps, 24)]
yearly_average = sum(daily_averages)/len(daily_averages)

print(daily_averages, yearly_average)