我想计算一组数值的日均值而不考虑负值。
我使用这个数据数组:
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])
答案 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)