在列表中找到平均值但忽略任何零 [Python]

10

我有一个温度数据的文本文件,看起来像这样:

3438012868.0    0.0 21.7    22.6    22.5    22.5    21.2
3438012875.0    0.0 21.6    22.6    22.5    22.5    21.2
3438012881.9    0.0 21.7    22.5    22.5    22.5    21.2
3438012888.9    0.0 21.6    22.6    22.5    22.5    21.2
3438012895.8    0.0 21.6    22.5    22.6    22.5    21.3
3438012902.8    0.0 21.6    22.5    22.5    22.5    21.2
3438012909.7    0.0 21.6    22.5    22.5    22.5    21.2
3438012916.6    0.0 21.6    22.5    22.5    22.5    21.2
3438012923.6    0.0 21.6    22.6    22.5    22.5    21.2
3438012930.5    0.0 21.6    22.5    22.5    22.5    21.2
3438012937.5    0.0 21.7    22.5    22.5    22.5    21.2
3438012944.5    0.0 21.6    22.5    22.5    22.5    21.3
3438012951.4    0.0 21.6    22.5    22.5    22.5    21.2
3438012958.4    0.0 21.6    22.5    22.5    22.5    21.3
3438012965.3    0.0 21.6    22.6    22.5    22.5    21.2
3438012972.3    0.0 21.6    22.5    22.5    22.5    21.3
3438012979.2    0.0 21.6    22.6    22.5    22.5    21.2
3438012986.1    0.0 21.6    22.5    22.5    22.5    21.3
3438012993.1    0.0 21.6    22.5    22.6    22.5    21.2
3438013000.0    0.0 21.6    0.0     22.5    22.5    21.3
3438013006.9    0.0 21.6    22.6    22.5    22.5    21.2
3438013014.4    0.0 21.6    22.5    22.5    22.5    21.3
3438013021.9    0.0 21.6    22.5    22.5    22.5    21.3
3438013029.9    0.0 21.6    22.5    22.5    22.5    21.2
3438013036.9    0.0 21.6    22.6    22.5    22.5    21.2
3438013044.6    0.0 21.6    22.5    22.5    22.5    21.2

但整个文件要长得多,这只是前几行。第一列是时间戳,接下来的6列是温度记录。我需要编写一个循环,找到6个测量值的平均值,但会忽略0.0的测量值,因为这意味着传感器没有开启。在后面的测量中,第一列确实有测量值。是否有一种方法可以编写if语句或其他方式,仅查找列表中非零数字的平均值?目前,我的代码如下:

time = []
t1 = []
t2 = []
t3 = []
t4 = []
t5 = []
t6 = []
newdate = []

temps = open('file_path','r')
sepfile = temps.read().replace('\n','').split('\r')
temps.close()

for plotpair in sepfile:
    data = plotpair.split('\t')
    time.append(float(data[0]))
    t1.append(float(data[1]))
    t2.append(float(data[2]))
    t3.append(float(data[3]))
    t4.append(float(data[4]))
    t5.append(float(data[5]))
    t6.append(float(data[6]))

for data_seconds in time:
    date = datetime(1904,1,1,5,26,02)
    delta = timedelta(seconds=data_seconds)
    newdate.append(date+delta)

for datapoint in t2,t3,t4,t5,t6:
    temperatures = np.array([t2,t3,t4,t5,t6]).mean(0).tolist()

目前的方法只能计算最后5个测量值的平均值。我希望找到一种更好的方法,可以忽略0.0并在第一列不为0时包含它。


你可以使用内置函数或第三方模块吗? - Bhargav Rao
你正在使用Python2还是Python3? - inspectorG4dget
为什么需要忽略、零和给任何数字加零让它保持不变? - Hackaholic
2
@Hackaholic:1、2、3的平均值是2;而1、2、3、0的平均值是1.5。看出问题了吗? - inspectorG4dget
哦,OP想在其中包含总数。 - Hackaholic
4个回答

40

之前的问题表明您已安装了NumPy。因此,使用NumPy,您可以将零设置为NaN,然后调用np.nanmean来计算平均值,忽略NaN:

import numpy as np

data = np.genfromtxt('data')
data[data == 0] = np.nan
means = np.nanmean(data[:, 1:], axis=1)
产生(yields)
array([ 22.1  ,  22.08 ,  22.08 ,  22.08 ,  22.1  ,  22.06 ,  22.06 ,
        22.06 ,  22.08 ,  22.06 ,  22.08 ,  22.08 ,  22.06 ,  22.08 ,
        22.08 ,  22.08 ,  22.08 ,  22.08 ,  22.08 ,  21.975,  22.08 ,
        22.08 ,  22.08 ,  22.06 ,  22.08 ,  22.06 ])

9
之前的问题表明您已经安装了NumPy。这是为了更好地帮助OP提供额外的帮助! - inspectorG4dget
1
通常情况下,由于传感器关闭,将0替换为NaN也是有意义的。 - ryanpattison
也许我没有理解问题的背景,但我似乎无法弄清为什么您在data[:, 1:]中使用1而不是data[:, :]。对我来说,这只会导致失去第一个平均值。 - Joshua M
1
dtype 应该是 floatcomplexobject。否则,np.nan 替换会抛出错误。ValueError: cannot convert float NaN to integer - Moj

3

这将与Python3兼容。

import csv

with open('path/to/input') as infile, open('path/to/output', 'w') as outfile:
    outfile = csv.writer(outfile, delimiter='\t')
    for time, *temps in csv.reader(infile, delimiter='\t'):
        temps = [float(t) for t in temps if t!='0.0']
        avg = sum(temps)/len(temps)
        outfile.writerow([time, avg])

3

使用 scipy.stats.tmean 可以创建一个截断/修剪平均值。

或者在将数据[X]附加到相应列表之前,可以检查float(data[X])是否等于0。


0
with open('infile') as f1, with open('outfile','w') as f2:
    for x in f1:
        nums = [float(i) for i in x.strip().split() if i!='0.0']
        avg = sum(nums[1:])/len(nums[1:])
        f2.write("{}\t{}".format(nums[0],avg))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接