TRNSYSの出力をPythonで取り扱う

TRNSYSの計算結果の出力の仕方はいくつかあります。Type65やType25がよく使われますが、ファイル形式としてはタブ、ペース区切りのテキストで書き出されます。

以下のリストはType25の出力例ですが、あまり読みやすいとは言えないですよね。

TIME                        TAIR_first_floor            TOP_first_floor             QHEAT_first_floor           QCOOL_first_floor           QELEQUIP_first_floor        QELLIGHT_first_floor        RELHUM_first_floor            HOURS                  NAV                     NAV                     NAV                     NAV                     NAV                     NAV                     NAV                        
+0.0000000000000000E+00     +2.0000000000000000E+01     +2.0000000000000000E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +0.0000000000000000E+00     +0.0000000000000000E+00     +5.0000000000000000E+01      
+1.0000000000000000E+00     +1.9830580301500703E+01     +1.9808233467796263E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +5.0010156123633521E+01      
+2.0000000000000000E+00     +1.9734312966979235E+01     +1.9765312092721750E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.9484453863858377E+01      
+3.0000000000000000E+00     +1.9771681072855184E+01     +1.9775732049503631E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.8758186593351304E+01      
+4.0000000000000000E+00     +1.9727156805112390E+01     +1.9738355860938952E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.8300004863545269E+01      
+5.0000000000000000E+00     +1.9696067740399105E+01     +1.9704197754226797E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.7823173447143830E+01      
+6.0000000000000000E+00     +1.9649950794393828E+01     +1.9658051948204182E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.7411311457958369E+01      
+7.0000000000000000E+00     +1.9598627168756757E+01     +1.9606091282868359E+01     +0.0000000000000000E+00     +0.0000000000000000E+00     +9.6768000000000015E+01     +0.0000000000000000E+00     +4.7033436866017283E+01    

これを通常はExcelへ読み込んで、10進表記やチャートに加工して結果を検討します。(ちょっと手間が掛かります)

Pythonで加工する

計算結果をもう少し手軽に加工できないか考えてみました。PythonにはCSVを扱う便利なパッケージが用意されているので、今回はその中からPandasを使ってDataFrameへ展開してみます。

#utf-8
import pandas as pd

# read the csv file and remove an unnecessary row.
csv_filename = 'type25a.txt'
csv = pd.read_csv(csv_filename, delim_whitespace=True)
df = csv.drop(0)   # remove the first row.
timestep = 1.0
step=str(timestep)+'H'
dt = pd.date_range('1995-01-01 0:00',periods=8761,freq=step) # series for datetime column. 
df['datetime']=dt
print(df)

ほんの数行でCSVのデータからDataFrameへ変換できます。ここでポイントは2箇所有ります。

空白、タブ区切りの指定

まず、最初は区切り文字の指定。Type25の出力は空白、タブで区切られています。何も指定せずに読み込むと、タブなどがデータとして誤って解釈されます(NaNとして扱われる)
以下のようにdelim_whitespaceを使って空白、タブ区切りを指定します。

csv = pd.read_csv(csv_filename, delim_whitespace=True)

不要な行の削除

2つめは2行目の削除です。テキストの1行目はカラムの名前、2行目には単位が書き出されています。この2行目の部分は値としては不要なので、読み込み後に削除しておきます。

下の図の赤枠部分。ここはカラム名でもデータでもないので削除しておきます。

HOURSの行を削除する
HOURSの行を削除する

やり方としては、下のコードのようにDataFrameの最初の行を削除すればOKです。

df = csv.drop(0)

以上でDataFrameへ展開、不要なデータの削除ができました。あとは、DataFrameの機能を使って必要に応じて加工することができます。

上記のサンプルでは日付時刻のカラムを追加しています。やはり通し時間(Hour)よりも日付時刻の方が分かり易いですよね。

Jupyterの実行例

Jupyterの実行画面
Jupyterの実行画面

動作環境

以下の環境で動作を確認しています。

Windows10 Pro(64bit)
Python:Anaconda 5.1(Python 3.6/64bit)
TRNSYS18.00.0017(64bit)

Pocket

2件のピンバック

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です