Вычисление и возврат средних значений в список

У меня длинный список с некоторыми значениями. Я хочу определить функцию, которая принимает список, и вычисляет среднее значение для каждых 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: не может выполнить сокращение с помощью гибкого типа

  • Prayon Array Slice с запятой?
  • Назначение списка с помощью
  • Проверяйте, имеют ли списки какие-либо элементы в python
  • Итеративный поиск / замена из списка кортежей в Python
  • Преобразование списка в последовательность строк
  • Я хочу группировать кортежи на основе аналогичных атрибутов
  •  def daily_mean_temp(hourly_temp): averages = [float(sum(myrange))/len(myrange) for myrange in zip(*[iter(hourly_temp)]*24)] return averages 

  • Найти, если значение существует в нескольких списках
  • Python List Slicing с None как аргумент
  • Разделите два списка в python
  • Объяснение того, как работает понимание списка?
  • Проверка уникальности всех элементов в списке
  • Эффективный способ переместить список в python
  • 5 Solutions collect form web for “Вычисление и возврат средних значений в список”

    Предполагая, что вам нужны независимые группы, вы можете использовать рецепт 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)] 

    Изменить : учитывая, что ваши данные выглядят как список строк, я бы предложил вам сначала конвертировать в float с помощью map :

     data = map(float, hourly_temp) 

    Предполагая, что ваши значения являются строками, как показано выше, и что у вас есть 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)] 
     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)] 

    Кажется, что-то в этом направлении работает:

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

    Используя этот рецепт группы , это довольно легко (очевидно, я синтезировал список 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) 
    Python - лучший язык программирования в мире.