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 月的数据。代码从适当的变量中调用数据适当的一天,但每个月都重复相同的数据。我不确定我哪里出了问题,但任何建议/帮助将不胜感激。

4

1 回答 1

1

每个for循环;您的代码在彼此内部有两个循环 - 它使用文件的第一行处理所有年份,然后处理第二行的所有年份,等等。这是您遇到的错误,但如果您只是去以某种方式修复它,另一个很快就会弹出。


现在,请在图书馆借一本好书,花点时间阅读和练习。或加入课程。找一位知识渊博的朋友为您检查您的代码。StackOverflow 可能会帮助您解决特定问题,但遗憾的是它不能教您这些概念。你走错了路;如果你继续这样下去,只会有麻烦。您应该回去更好地学习基础知识,从长远来看,它会变得容易得多。

计算机可以为您完成繁琐且重复的任务。你永远不应该输入一个巨大的数字列表或编号变量。熟悉列表(和列表的列表)和范围函数。

对变量使用描述性名称,而不是缩写。这是 Python,我们喜欢清晰的东西。并将每个语句放在自己的行中;所有这些分号看起来都很丑。如果您想共享代码、获得帮助或只是整理自己的想法,这些事情很重要。

研究csv 模块的文档并使用它的阅读器,而不仅仅是编写器。

熟悉列表切片,尤其是 line[1::3] 种类。

了解文件的with语句。

如果你在每个 if/elif 中做同样的事情,把它从那里移到一个共同的地方。

祝你有一天成为一名优秀的程序员 :)

于 2011-10-17T18:21:23.577 回答