我正在使用校准软件PEST中的一个实用程序,它只与样本站点文件类型兼容。我想使用此实用程序来校准我的模型,但我的模型的输出格式非常不同(CSV)。 SSF以制表符分隔,仅包含4个关键数据列:示例站点ID,日期(MM / DD / YYYY),时间和流量。
SSF文件示例:
134 01/01/1980 00:00:00 34
134 01/02/1980 00:00:00 30
134 01/03/1980 00:00:00 28
134 01/04/1980 00:00:00 38
我的水文模型的输出被写入CSV文件,其中包含日期(YYYYMMDD),模拟流量(Qsim),观测流量(Qobs),温度,降水量,实际蒸发量,潜在蒸发量和雪水当量值。
模型输出示例:
134
Date, Qsim, Qobs, Temp, Precip, AET, PET, SWE
19800101, 34, 31, 11, 21, 3.4, 4.0, 0
19800102, 30, 30, 11, 15, 3.0, 4.4, 0
19800103, 28, 25, 12, 0, 3.1, 4.0, 0
19800104, 38, 45, 8, 30, 0.5, 3.8, 0
所以我已经确定为了进行转换,我将:
我绝对是python的初学者,这是我到目前为止能够编写的代码:
import csv
HBVout = csv.reader(open('C:\\ENVpest\\Output\\Results.csv', 'rb'))
HBVout.next()
newSSF = csv.writer(open('SSF1.txt', 'wb+'), delimiter='\t')
for cline in HBVout:
new_line = [val for col, val in enumerate(cline) if col not in (2,3,4,5,6,7)]
newSSF.writerow(new_line)
我可以跳过第一行,删除不必要的列,并重写为制表符分隔文件。我非常感谢有关向文件添加列和重新格式化日期的任何帮助!我已经搜索了SO和其他网站上的其他问题,但还没有找到任何运气。
答案 0 :(得分:1)
使用内置datetime
模块可以很容易地重新格式化日期,如下所示:
from datetime import datetime
d = datetime.strptime("19800508", "%Y%m%d") # convert your string to a
# datetime object
s = d.strftime("%d/%m/%Y") # gives the string "08/05/1980"
不可否认,这个模块使用起来有点混乱 - 我总是要在使用之前查阅文档 - 但它非常强大。处理日期转换不是人们想要手动完成的事情。
我对csv
模块没有太多经验,但我认为你走的是正确的。
答案 1 :(得分:1)
这是我将如何做到的。你的代码起初有点混乱,因为它正在读取你正在调用HBVout
的另一个程序的输出。我也不明白你在#3中关于删除csv文件中的第2-7行的含义,所以忽略了它。虽然datetime
模块可以用来转换日期的格式,但它是如此微不足道,它只是手动完成。
一个显着的区别是使用csv.DictReader
读取数据,因为这使得访问各个字段的可读性更高,因为每行读取都会成为值字典。
import csv
with open('Results.csv', 'rb') as inf, open('SSF1.txt', 'wb') as outf:
site_id = inf.next().rstrip() # read past site id on first line
HBVout = csv.DictReader(inf, skipinitialspace=True) # will read header line
ssf = csv.writer(outf, delimiter='\t')
for data in HBVout:
date = data['Date'] # convert date from YYYYMMDD to MM/DD/YYYY
date = '/'.join((date[4:6], date[6:8], date[0:4]))
ssf.writerow([site_id, date, '00:00:00', data['Qsim']])
从模型输出示例创建的SSF文件的内容:
134\t01/01/1980\t00:00:00\t34\n
134\t01/02/1980\t00:00:00\t30\n
134\t01/03/1980\t00:00:00\t28\n
134\t01/04/1980\t00:00:00\t38\n