2011-10-17 88 views
0

我已經發布了氣候數據表,基本上,我需要將行的部分轉置爲列,反之亦然。不幸的是,這種格式有些尷尬。數據以年份,月份,月份的天數,行中氣候數據的類型等列來顯示,然後連續93列,每列代表一個日常值,成功並在相關標誌之前(所以3個術語,一個值和2個標誌,每月的每一天)。雖然月份長短不一,但在最後幾欄中填寫的空值較短。我想要的是用於處理和建模目的的電子表格/ .csv文件,其列如下:從連續幾個月的連續幾個月中調用行數據並將其寫入列?

年,月,日(即數字1到31),然後五列表示類型氣候數據(降水,積雪,積雪,tmax,tmin)。

如果我也可以獲得具有適當標誌值的列,那將很棒,但這不是優先級。因此,我已經編寫了下面的代碼來將行解包到列表中(可能效率非常低,但我是新手),它代表年份,月份,氣候變量類型,變量值,flag1和flag2(基於行中的位置) (對應於天,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月份的數據。代碼從相應的變量調用數據適當的一天,但每個月一個月重複相同的數據。我不知道我在哪裏出錯了,但任何建議/幫助將不勝感激。

+0

你可以顯示一個輸入的例子嗎?另外,您在這裏發佈的代碼是否正確縮進?我在奇怪的地方看到了一些東西...... – Avaris

回答

1

每個for產生一個循環;你的代碼在對方內部有兩個循環多年 - 它會一直處理所有年份與文件的第一行,然後所有年份的第二等,這是你遇到的錯誤,但如果你只是以某種方式去修復它,另一個會很快彈出。


現在,請在圖書館借一本好的Python書,花些時間閱讀和做練習。或加入課程。找一位知識淵博的朋友爲你查看你的代碼。 StackOverflow可能會幫助你解決一個特定的問題,但遺憾的是它不能教你這些概念。你走錯了路;如果你像這樣繼續下去,沒有任何事情可以解決。你應該回去學習一些更好的基礎知識,從長遠來看這會讓它變得更容易。

計算機是在那裏爲你做乏味和重複的任務。你應該從不鍵入一個巨大的數字或編號變量列表。 熟悉列表(和列表清單)以及range函數。

對變量使用描述性名稱,而不是縮寫。這是Python,我們喜歡事情清楚。並把每一個陳述放在自己的路線上;所有這些分號看起來很醜。如果你想分享代碼,獲得幫助,或只是組織自己的想法,這些事情就很重要。

研究csv module的文檔,並使用它的閱讀器,而不僅僅是作者。熟悉list slicing,尤其是行[1 :: 3]品種。

瞭解文件with聲明。

如果你在每個if/elif中做同樣的事情,把它從那裏移到一個普通的地方。

下面是你成爲一個好的程序員有一天:)