首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >水文模型CSV文件的转换

水文模型CSV文件的转换
EN

Stack Overflow用户
提问于 2013-10-16 00:49:38
回答 2查看 247关注 0票数 1

我正在使用校准软件PEST中的一个实用工具,它只与示例站点文件类型兼容。我想使用这个工具来校准我的模型,但是我的模型的输出是一个非常不同的格式(CSV)。SSF是由制表符分隔的,只包含4个关键列的数据:示例站点ID、日期(MM/DD/YYYY)、时间和流。

SSF文件示例:

代码语言:javascript
复制
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)、温度、降水、实际蒸发、潜在蒸发和雪-水当量。

模型输出示例:

代码语言:javascript
复制
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

因此,我决定,为了进行转换,我将:

  1. 添加包含站点ID的列0( csv文件中的第0行)
  2. 删除csv文件中的行0和1
  3. 删除csv文件中的第2-7行。
  4. 为时间添加一列(在本例中,我只需在col 2中为每一行添加"00:00:00“)
  5. 将日期从YYYYMMDD改为MM/DD/YYYY
  6. 写入分隔符的文件选项卡

我肯定是python的初学者,到目前为止,我已经编写了以下代码:

代码语言:javascript
复制
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和其他网站上搜索过其他问题,但还没有找到任何运气。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-16 02:31:52

我会这么做的。您的代码一开始有点混乱,因为它正在读取另一个程序的输出,您称之为HBVout。我也不明白在#3中删除csv文件中的第2-7行意味着什么,所以忽略了它。虽然可以使用datetime模块来转换日期的格式,但它太琐碎了,只是手动完成。

一个值得注意的区别是数据是在使用csv.DictReader读取的,因为这使得访问各种字段更加可读性,因为每行读取都会成为值字典。

代码语言:javascript
复制
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文件的内容:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-10-16 01:56:18

可以很容易地使用内置的datetime模块来重新格式化日期,如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19393518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档