简体   繁体   中英

Calculate and return average values in a list

I have a long list with some values. I want to define a function that take the list and calculates the average for every 24 values in the list, and returns the average values as a list. How do I do this? I have 8760 elements in the list, and the list returned should give 8760/24=365 elements.

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

Is this correct? I get an error saying: TypeError: cannot perform reduce with flexible type

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

Assuming that you want independent groups, you can use the 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)

And then easily get the average of each group :

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

Edit : given that your data appears to be a list of strings, I would suggest you convert to floats first using map :

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

is a pretty neat way to do it ... note that it will truncate any end variables not nicely divisible by the range size

if you need to have uneven lists at the end (ie chunk_size of 10 with a big_list of 17 would have 7 left over)

 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)]

Assuming your values are strings, as you show above, and that you have NumPy handy, this should be fast:

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

And if you might have NaNs:

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

And if you start with proper floats:

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) ]

Using this grouper recipe , it's pretty easy (obviously, I've synthesized the temps list):

#!/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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM