2013-10-16 34 views
1

我與校準軟件PEST,這只是一個示例站點文件類型兼容內的公用事業工作。我想用此實用程序來校準我的模型,但我的模型輸出格式非常不同(CSV)。 SSF是製表符分隔的,僅包含4個關鍵數據列:示例站點ID,日期(MM/DD/YYYY),時間和Streamflow。 SSF文件的轉換CSV文件的水文模型

例子:

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 

從我的水文模型的輸出被寫入到包含日期(年月日),仿真流量(QSIM),觀察流量(Qobs)CSV文件,氣溫,降水,實際蒸發量,潛在蒸發量和雪水當量。模型輸出的

例子:

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(行0在CSV文件)CSV文件
  2. 刪除行0和1
  3. CSV文件
  4. 添加AC刪除行2-7 olumn的時間(在這種情況下,我只需要在「00:00:00」的第2列的每一行)
  5. 格式化日期從年月日到MM/DD/YYYY
  6. 寫文件的製表符分隔

我絕對有蟒蛇一個初學者,這是我的代碼已經能夠到目前爲止寫:

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和其他網站上的其他問題,但還沒有找到任何運氣。

回答

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 
+0

謝謝!是的,「刪除第2-7行」是一個錯字,意思是「刪除第2-7列」。 雖然我在運行代碼時遇到了語法錯誤,關於「open()as inf,open()as outf」)之間的逗號以及我不確定爲什麼這是語法錯誤。你有什麼可以解決它的想法嗎? 除此之外,我真的很喜歡你爲此寫的劇本,它非常簡單,並以非常直接的方式完成了所有的事情。我絕對需要更多地關注DictReader,它似乎是重組CSV文件的一種非常強大的方式。 – Geogrammer

+0

Python 2.7之前不允許多個上下文表達式。解決方法是將一個嵌套在另一個內部,這將使得還需要縮進另外兩個級別中的所有語句。 – martineau

+0

是的,使用嵌套的「work ... as」語句,但我現在收到「KeyError:Date」。對於DictReader()幾乎沒有經驗,我剛開始研究一下,但還沒有找到明確的解決方案來解決這個關鍵錯誤。你有什麼建議嗎? – Geogrammer

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模塊太多的經驗,但我認爲你是在正確的軌道上。

+0

謝謝!是的,我正在研究'datetime',但這對我自己來說肯定有點混亂! – Geogrammer