0

私は気候データのシートを広げましたが、そのためには、基本的に、行の一部を列に、またはその逆に転置する必要があります。残念ながら、フォーマットはやや扱いにくいです。データは、年、月、月の日数、行の気候データのタイプの列で私に届きました。その後、それぞれが日次の値を表す連続する93列が成功し、関連するフラグが前に付きました(つまり月の各日に3つの用語、値、および2つのフラグ)。月の長さはさまざまですが、短い月は最後の数列にnull値で埋められています。処理とモデリングの目的で必要なのは、次のような列を持つスプレッドシート/.csvファイルです。

年、月、日(つまり、1から31までの数字)、および気候データのタイプ(降水量、雪、雪水、tmax、tmin)を表す5つの列。

適切なフラグ値を持つ列も取得できれば、それは素晴らしいことですが、優先順位ではありません。したがって、行をリストに解凍するために以下のコードを記述しました(おそらく非常に非効率的ですが、これは初めてです)。行の場所に基づいて、年、月、気候変数のタイプ、変数値、flag1およびflag2を表します。 (1日に対応、1から31):

import matplotlib.mlab as mlab
from matplotlib.pyplot import figure, show
import numpy as np

import scipy
import csv

durham='C:\\Users\\LocalUser\\Desktop\\Drought Data\\My_Met_Data\\USHCN\\Durham.csv'

txt='met'
station='Durham'

output=station+"_"+txt+"_"+"new"+".csv"

infile=open(durham,'r')
outfile=open(output,'w')
writer=csv.writer(outfile)

yr=[]; mon=[]; var=[]; unit=[]; flag1=   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];\
flag2=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];\
value=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];\
valu=[]; flg1=[]; flg2=[]; prcp=[]; snow=[]; snwd=[]; tmax=[]; tmin=[]; row=[]
for line in infile:
  stationid, variable, units, year, month, days, flag1[0], value[0], flag2[0], flag1[1], value[1], flag2[1], flag1[2], value[2], flag2[2],\
  flag1[3], value[3], flag2[3], flag1[4], value[4], flag2[4], flag1[5], value[5], flag2[5], flag1[6], value[6], flag2[6],\
  flag1[7], value[7], flag2[7], flag1[8], value[8], flag2[8] ,flag1[9], value[9], flag2[9], flag1[10], value[10], flag2[10],\
  flag1[11], value[11], flag2[11], flag1[12], value[12], flag2[12], flag1[13], value[13], flag2[13], flag1[14], value[14], flag2[14],\
  flag1[15], value[15], flag2[15], flag1[16], value[16], flag2[16], flag1[17], value[17], flag2[17], flag1[18], value[18], flag2[18],\
  flag1[19], value[19], flag2[19], flag1[20], value[20], flag2[20], flag1[21], value[21], flag2[21], flag1[22], value[22], flag2[22],\
  flag1[23], value[23], flag2[23], flag1[24], value[24], flag2[24], flag1[25], value[25], flag2[25], flag1[26], value[26], flag2[26],\
  flag1[27], value[27], flag2[27], flag1[28], value[28], flag2[28], flag1[29], value[29], flag2[29], flag1[30], value[30], flag2[30]=line.split(',')
  yr=[int(year)]
  mon=[int(month)]
  var=variable
  unit=units

  for yr in range(1926, 2003):
     for mon in range(1,13):
        if var=='PRCP':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            prcp.append(valu[j])

        elif var=='SNOW':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            snow.append(valu[j])

        elif var=='SNWD':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            snwd.append(valu[j])

        elif var=='TMAX':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            tmax.append(valu[j])

        elif var=='TMIN':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            tmin.append(valu[j])

            row=[yr, mon, j+1, prcp[j], snow[j], snwd[j], tmax[j], tmin[j]]
            writer.writerow(row)


infile.close()
outfile.close()

さて、これを実行するとメモリエラーが発生することは別として、気候変数のいくつかを削除すると、必要な形式の.csvファイルを正常に取得できます。問題は、毎月、毎年(1926-2002)に、同じ気候データ値、つまり1926年1月のデータを報告することです。コードは、次の適切な変数からデータを呼び出しています。適切な日ですが、毎月同じデータを繰り返します。これでどこが間違っているのかわかりませんが、提案やヘルプをいただければ幸いです。

4

1 に答える 1

1

それぞれforがループを作ります。あなたのコードには、互いの内部に年の 2 つのループがあります。ファイルの最初の行ですべての年を処理し、次に 2 番目の行ですべての年を処理します。これはあなたが遭遇しているエラーですが、どうにか修正してください。すぐに別のものがポップアップします。


さて、図書館で優れた Python の本を借りて、時間をかけて読んだり演習を行ったりしてください。または、コースに参加してください。知識のある友人にコードをレビューしてもらいましょう。StackOverflow は特定の問題を解決するのに役立つかもしれませんが、残念ながら概念を教えることはできません。あなたは間違った道を進んでいます。このままだと先が大変なことしかない。戻って基本をもう少しよく学ぶ必要があります。そうすれば、長期的にははるかに簡単になります。

コンピューターは、退屈で反復的なタスクを実行するために存在します。数字や番号付き変数の膨大なリストを入力しないでください。リスト (およびリストのリスト) と範囲関数に慣れてください。

省略形ではなく、わかりやすい名前を変数に使用してください。これは Python です。そして、各ステートメントをそれぞれの行に入れます。これらのセミコロンはすべて醜く見えます。これらのことは、コードを共有したり、助けを求めたり、自分の考えを整理したりしたい場合に重要です。

csv モジュールのドキュメントを調べて、ライターだけでなくリーダーも使用してください。

list slicing、特に line[1::3] の種類に慣れてください。

ファイルのwithステートメントについて学習します。

各 if/elif で同じことを行う場合は、そこから共通の場所に移動します。

いつか良いプログラマーになるあなたへ:)

于 2011-10-17T18:21:23.577 に答える