我有一些包含一些值的长列表。我想定义一个函数,该函数获取列表并计算列表中每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
答案 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)