首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python计算滚动平均值

使用python计算滚动平均值
EN

Stack Overflow用户
提问于 2013-05-13 10:14:17
回答 2查看 703关注 0票数 0

我刚刚开始学习python。我正在用它来写一个脚本来计算盐流入滚动平均值。我有这样的数据

代码语言:javascript
复制
Date    A4260502_Flow   A4261051_Flow   A4260502_EC A4261051_EC
25/02/1970  1304    0   411 0   1304            
26/02/1970  1331    0   391 0   1331            
27/02/1970  0   0   420 411 0           
28/02/1970  0   0   400 391 0           
1/03/1970   0   0   0   420 0           
2/03/1970   1351    1304    405 400 1327.5      
3/03/1970   2819    1331    415 405 2075        
4/03/1970   2816    0   413 0   2816            
5/03/1970   0   1351    0   415 1351            
6/03/1970   0   0   0   0   0           
7/03/1970   0   2819    0   413 2819            
8/03/1970   0   0   0   0   0           
9/03/1970   0   2816    0   412 2816

我的脚本是

代码语言:javascript
复制
inputfilename = "output.csv"
outputfilename = "SI_calculation.csv"

# Open files
infile = open(inputfilename,"r+")
outfile = open(outputfilename,'w')

# Initialise variables  
EC_conversion = 0.000525
rolling_avg = 5
flow_avg_list = []
SI_list = []
SI_ra_list = []
SI_ra1 = []

# Import module
import csv
import numpy                 #L20


table = []
reader = csv.reader(infile)         #read
for row in csv.reader(infile):
    table.append(row)
infile.close()

for r in range(1,len(table)):        
    for c in range(1,len(row)): #l30
        table[r][c] = float(table[r][c])


#Calculating flow average
for r in range(1,len(table)):

    flow1 = table[r][1]
    flow2 = table[r][2]
    if flow1 == 0.0:                 
        flow_avg = flow2            #l40
    elif flow2 == 0.0:
        flow_avg = flow1
    else:
        flow_avg = (flow1+flow2)/2
    flow_avg_list.append(flow_avg)

#Calculating salt inflow
for r in range(1,len(table)):
    s1 = table[r][3]                               
    s2 = table[r][4]        #l50
    if s1 == 0.0 or s2 == 0.0 or flow_avg_list[r-1] == 0.0:
        SI = 0.0
    else:
        SI = EC_conversion*flow_avg_list[r-1]*(s2-s1)
    SI_list.append(SI)
print SI_list    

#Calculating rolling average salt inflow
for r in range(1,len(table)):                 
    if r < 5:       #rolling-avg = 5
        for i in range(0,r+5):      #l60
            S = SI_list[i]
            SI_ra1.append(S)
        SI_ra = numpy.mean(SI_ra1)
        SI_ra_list.append(SI_ra)
    elif r > (len(table) - 4):
        for i in range(r-5,len(table)-1):
            S = SI_list[i]
            SI_ra1.append(S)
        SI_ra = numpy.mean(SI_ra1)
        SI_ra_list.append(SI_ra)    #l70
    else:
        for i in range(r-5,r+5):
            S = SI_list[i]       #Line 73
            SI_ra1.append(S)
        SI_ra = numpy.mean(SI_ra1)
        SI_ra_list.append(SI_ra)
print SI_ra_list

当我运行脚本时,它给了我一个错误:Line 73: list index out of range.,有人知道这个错误是什么吗?对不起,这是一个很长的脚本。我还不知道怎么把它缩短。

EN

回答 2

Stack Overflow用户

发布于 2013-05-13 10:25:44

请丢弃您的代码,并使用此问题的答案作为基础重新开始:Rolling Average to calculate rainfall intensity

并不是说您的代码不能工作,而是没有必要用Python编写Fortan代码。我链接到的问题更好地利用了Python的特性,如果你解决了这个问题,包括使用插值类Linear Interpolation - Python跟踪问题的链接,那么你将省去数小时的努力。

不需要自己犯所有的错误。从模仿大师开始,然后定制他们的技术以满足您的需求,几年后,您也将成为Python大师。

票数 3
EN

Stack Overflow用户

发布于 2013-05-13 10:24:49

在第65行,将条件更改为:

代码语言:javascript
复制
elif r > (len(table) - 5):

问题是,当您在第73行迭代列表的末尾时,您试图获取列表中的下5个数据点,但列表中只剩下4个数据点,因此您的索引超出了列表的长度,因此抛出了异常。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16514017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档