在python中计算数组的每日均值

时间:2015-09-05 13:54:31

标签: python arrays

我想计算一组数值的日均值而不考虑负值。

我使用这个数据数组:

Val=['45','25','45','26','-999','87','9','5','4','5','78','98','14','25',
     '34','15','15','14'...]

表示一个月(30天)的每小时值。

我试图从平均值中删除负值,但我没有成功。

在python中,最简单的方法是计算每日均值并获得30个值的数组?

感谢您的帮助

以下是代码:

F =开放(' FILE.CSV&#39)

csv_f = csv.reader(F)

VAL = []

表示csv_f中的行:

   val.append(row[0])

表示范围内的i(0,len(val [:]) - 24,24):

   j=i+24

   mean(val[i:j])

4 个答案:

答案 0 :(得分:1)

这是一个选项:

假设您有6个值的数组,并且您对3个元素块的非负值(在您的情况下为24个元素块)感兴趣。

In [14]: a = np.array([3,4,-999,5,-100,6], dtype=np.float)

In [15]: a[a < 0] = np.nan

In [16]: np.nanmean(a.reshape((-1, 3)), axis=1)
Out[16]: array([ 3.5,  5.5])

答案 1 :(得分:1)

使用IF条件和int()一起尝试列表理解。需要先将原始值列表分成每日块

import random

values = random.sample(range(-5, 100), 96)

def mean(l):
    # list comprehension with if condition to remove negatives and cast to int
    l = [int(numeric_string) for numeric_string in l if int(numeric_string) > 0]

    return sum(l) / len(l)

def chunk(l, n):
    # slice the values list into n sized chunks
    return [l[int(i):int(i) + n] for i in range(0, len(l), n)]

y = [ mean(day) for day in chunk(values, 24)]

print(y)

答案 2 :(得分:0)

假设Val包含字符串,每天24个值(因此len(Val)是24的倍数):

# turn the 1D input array into a 2D array, one line per day
DailyVals = [[int(h) for h in Val[i:i+24]]
             for i in range(len(Val)/24)]
# prune negative values
ValidVals = [[h for h in day if h >= 0]
             for day in DailyVals]
# compute the mean
Mean = [sum(val) / len(val) for val in ValidVals]

答案 3 :(得分:0)

这样的事情可以避免创建临时列表:

vals = ['45','25','45','26','-999','87','9',
        '5','4','5','78','98','14','25',
        '34','15','15','14']

daily_mean = (sum(int(v) for v in vals if int(v) > -1) /
              sum(1 for v in vals if int(v) > -1)