转换Hydrologic Mod的CSV文件

2024-09-28 03:23:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用校准软件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)、温度、降水量、实际蒸发量、潜在蒸发量和雪水当量。在

模型输出示例:

^{pr2}$

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

  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的初学者,到目前为止,我已经能够编写以下代码:

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)

我可以跳过第一行,删除不必要的列,并重写为制表符分隔的文件。我将非常感谢任何帮助添加列到文件和重新格式化日期!我在其他网站上搜索过其他问题,但还没有找到任何运气。在


Tags: 文件csvin模型实用程序id示例站点
2条回答

下面是我该怎么做的。您的代码一开始有点混乱,因为它正在读取您调用的另一个程序的输出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文件的内容示例:

^{pr2}$

使用内置的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模块没有太多的经验,但我认为您的思路是正确的。在

相关问题 更多 >

    热门问题