0

Pythonの学習を始めたばかりです。これを使用して、塩の流入のローリング平均を計算するスクリプトを作成しています。そんなデータ持ってる

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

そして、私のスクリプトは

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.のエラーが表示されました。すみません、これは長いスクリプトです。短くする方法はまだわかりません。

4

2 に答える 2

3

コードを破棄して、この質問への回答をベースとして最初からやり直してください: ローリング平均による降雨強度の計算

コードが機能しなかったわけではありませんが、Python で Fortan コードを記述する必要はありません。私がリンクした質問は、Python の機能をより有効に活用します。Interpolate class Linear Interpolation - Pythonを使用して質問へのリンクをフォローアップするなど、これに取り組むと、 膨大な時間を節約できます。

自分ですべての間違いを犯す必要はありません。マスターを真似ることから始めて、ニーズに合わせてテクニックをカスタマイズすれば、数年後にはあなたも Python のマスターになります。

于 2013-05-13T02:25:43.947 に答える
2

65 行目で、条件を次のように変更します。

elif r > (len(table) - 5):

問題は、73 行目でリストの最後に向かって反復するときに、リスト内の次の 5 つのデータポイントを取得しようとしていますが、リストには 4 つのデータポイントしか残っていないため、リストの長さを超えてインデックスを作成していることです。 、したがって、例外がスローされます。

于 2013-05-13T02:24:48.613 に答える