我已经传播了大量的气候数据,基本上,我需要将部分的行转换成列,反之亦然。不幸的是,这种格式有些尴尬。这些数据提供给我的是年份、月份、月份天数、行中气候数据的类型以及连续的93列(每个列代表一个日值),这些列继承并在前面加上一个相关的标志(因此,每个月的每一天都有3个术语、一个值和2个标志)。虽然月份的长度不同,但在最后几列中,较短的月份中已经填充了空值。为了处理和建模目的,我想要的是一个电子表格/..csv文件,其中列如下:
年、月、日(即1到31),然后用5列表示气候数据的类型(精度、雪、雪水、tmax、tmin)。
如果我也能得到带有适当标志值的列,那就太好了,但这不是一个优先事项。因此,我编写了下面的代码,将行解压缩到列表中(可能效率很低,但我是新手),它根据行中的位置(对应于1到31天)表示年份、月份、气候变量类型、变量值、flag1和flag2:
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月的数据。代码正在为适当的一天从适当的变量调用数据,但是逐个月地重复相同的数据。我不知道我在这件事上哪里出了问题,但任何建议/帮助都将不胜感激。
发布于 2011-10-17 18:21:23
每个for都有一个循环;您的代码在彼此之间有两个循环--它用文件的第一行来处理所有的年,然后用第二行处理所有的年。这就是您正在运行的错误,但是如果您只是去修复它,另一个循环很快就会弹出。
现在,请在图书馆借来一本好的Python书,花些时间阅读和做练习。或者参加一门课程。找一个知识渊博的朋友帮你复习你的代码。StackOverflow可能会帮助您解决特定的问题,但遗憾的是,它无法教会您概念。你走错了路;如果你继续这样下去,前面就只有麻烦了。你应该回到过去,更好地学习基础知识,从长远来看,这样做会容易得多。
电脑是用来为你做单调和重复的工作的。您不应该输入一个庞大的数字或编号变量列表。熟悉列表(和列表列表)和范围函数。
对变量使用描述性名称,而不是缩写。这是Python,我们喜欢清晰的东西。并将每个语句放在自己的行上;所有这些分号看起来都很难看。如果您想要共享代码,获得帮助,或者只是组织您自己的想法,这些事情是很重要的。
研究csv模块的文档并使用它的阅读器,而不仅仅是作者。
熟悉列表切片,特别是第1::3行。
学习文件的使用语句。
如果您在每个if/elif中都做了相同的事情,那么将它移到一个共同的地方。
有一天你会成为一名优秀的程序员。)
https://stackoverflow.com/questions/7797268
复制相似问题