[英]Calculate and return average values in a list
我列出了一些值。 我想定义一个函数,该函数接受列表并计算列表中每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:无法使用灵活类型执行归约
def daily_mean_temp(hourly_temp):
averages = [float(sum(myrange))/len(myrange)
for myrange in zip(*[iter(hourly_temp)]*24)]
return averages
假设您想要独立的组,则可以使用grouper
itertools
配方 :
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)
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)]
如上所示,假设您的值是字符串,并且手边有NumPy,这应该很快:
import numpy as np
averages = [x.mean() for x in np.array_split(
[float(x) for x in hourly_temp], 365)]
如果您可能有NaN:
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)]
遵循这些思路的东西似乎可行:
[ sum(hourly_temp[i:i+24]) / len(hourly_temp[i:i+24]) for i in xrange(0, len(hourly_temp), 24) ]
使用这个grouper
食谱 ,这很容易(显然,我已经合成了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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.