2011-10-17 4 views
0

필자는 본질적으로 열의 일부를 열로 또는 그 반대로 조 변경해야하는 기후 데이터 시트를 보급했습니다. 불행히도 형식은 다소 어색합니다. 그 데이터는 년, 월, 날의 날 수, 행의 기후 데이터 유형, 그리고 매일 값을 나타내는 연속적인 93 개의 열이 성공하고 관련 플래그가 붙어서 나에게 나왔습니다 (그래서 3 개월, 가치 및 2 플래그, 매일 각 달). 달의 길이는 다양하지만 마지막 몇 열에서는 더 짧은 달이 널 값으로 채워집니다. 내가 원하는 것은 처리 및 모델링 목적으로 다음과 같은 열이 포함 된 스프레드 시트/.csv 파일입니다.연속적인 yrs에서 연속적인 개월의 행 데이터를 호출하고이를 컬럼에 기록 하시겠습니까?

년, 월, 일 (예 : 숫자 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 파일을 가져옵니다. 문제는 매달 1 년마다 (1926-2002 년) 동일한 기후 데이터 값, 즉 1926 년 1 월의 데이터를보고한다는 것입니다. 코드는 적절한 변수에서 데이터를 호출합니다. 적절한 날이지만 동일한 데이터가 한 달에 한 번 반복됩니다. 나는 이것으로 어디서 잘못되었는지 모르겠다. 그러나 어떤 제안/도움이라도 대단히 감사 할 것이다.

+0

입력 예를 보여줄 수 있습니까? 또한 여기에 게시 한 코드가 제대로 들여 쓰기되어 있습니까? 나는 이상한 곳에서 몇 가지를 본다 ... – Avaris

답변

1

for은 루프를 만듭니다. 귀하의 코드는 서로 내부에서 두 개의 루프를 가지고 있습니다 - 그것은 모든 연도를 파일의 첫 번째 줄과 함께 처리 한 다음 두 번째 등의 모든 연도를 처리합니다.이 오류는 실행중인 오류입니다. 가서 어떻게 든 고쳐 주면 곧 다른 팝업이 갑자기 나타납니다.


이제 도서관에서 좋은 Python 책을 빌리고 연습 시간을 보내고 연습 해보십시오. 또는 코스에 가입하십시오. 지식이 풍부한 친구를 통해 코드를 검토하십시오. StackOverflow는 특정 문제를 해결하는 데 도움이 될 수 있지만 슬프게도 개념을 가르쳐 줄 수는 없습니다. 너는 잘못된 길을 가고있다. 당신이 이대로 계속한다면 아무 문제가 없습니다. 돌아가서 기본 사항을 조금 더 배우고, 장기적으로 훨씬 쉽게 할 수 있어야합니다.

컴퓨터는 지루하고 반복적 인 작업을 수행합니다. 결코 숫자 또는 번호가 매겨진 변수의 거대한 목록을 입력해야합니다. 목록 (및 목록 목록) 및 range 기능에 익숙해 지십시오.

변수에 설명적인 이름을 사용하고 약어는 사용하지 마십시오. 이것은 파이썬입니다. 우리는 일을 분명히합니다. 그리고 각 문장을 각자의 줄에 넣으십시오. 모든 세미콜론은보기 흉하게 보입니다. 이러한 것들은 코드를 공유하고, 도움을 받거나, 자신의 생각을 정리하려는 경우 중요합니다.

csv module에 대한 설명서를 살펴보고 작성자가 아닌 해당 독자도 사용하십시오.

list slicing, 특히 줄 [1 :: 3] 종류에 익숙해 지십시오.

파일에 대해 with 문을 알아보십시오.

if/elif에서 각각 동일한 작업을 수행하는 경우 일반적인 장소로 이동하십시오.

언젠가는 당신이 좋은 프로그래머가되고 있습니다 :)

관련 문제