2015年1月8日木曜日

[Python] NIEDのASCIIフォーマットデータを変換(単位:gal)してcsvファイルに書き出す

防災科学技術研究所(NIED)のKiK-net,K_NETの強震観測データ(加速度)は,gal単位の加速度をスケールファクターで除算した値で記録されています.
取り扱い(図化することを想定)上,記録にスケールファクターを乗じて変換した方が扱いやすいので,変換結果を.csv形式のファイルに書き出すプログラムです(KiK-netのデータを変換することを想定し,一応,動きますが,もっとスマートな書き方があると思うので,今後,改良を加えていく予定です).
プログラム内の'***'はNIEDからダウンロードしたKiK-netのデータ名を表しているので,随時書き換えが必要です.また,これらのデータは,下記のプログラムと同じ階層に置かれているものとしています.

# Initial setting
import numpy as np
import csv

# Function 'getKiK-net'
def Convert2Acc(data):
    tokens = data.split()

    # Scale factor
    (Scale, Factor) = tokens[tokens.index('Factor')+1].split('(gal)/')

    # Strong motion
    items = tokens[tokens.index('Memo.')+1:]

    rdata = np.array(items, dtype=np.float64)   # rdata: raw data
    acc_gal = (rdata - rdata[0]) * float(Scale) / float(Factor)

    return acc_gal  # acc_gal: Acc. converted unit into gal

# Read data filess
rfile_EW1 = './KiK_net/KMMH041604160125.EW1'
fr_EW1 = open(rfile_EW1, 'r')
EW1_gal = fr_EW1.read()
fr_EW1.close()

rfile_NS1 = './KiK_net/KMMH041604160125.NS1'
fr_NS1 = open(rfile_NS1, 'r')
NS1_gal = fr_NS1.read()
fr_NS1.close()

rfile_UD1 = './KiK_net/KMMH041604160125.UD1'
fr_UD1 = open(rfile_UD1, 'r')
UD1_gal = fr_UD1.read()
fr_UD1.close()

rfile_EW2 = './KiK_net/KMMH041604160125.EW2'
fr_EW2 = open(rfile_EW2, 'r')
EW2_gal = fr_EW2.read()
fr_EW2.close()

rfile_NS2 = './KiK_net/KMMH041604160125.NS2'
fr_NS2 = open(rfile_NS2, 'r')
NS2_gal = fr_NS2.read()
fr_NS2.close()

rfile_UD2 = './KiK_net/KMMH041604160125.UD2'
fr_UD2 = open(rfile_UD2, 'r')
UD2_gal = fr_UD2.read()
fr_UD2.close()

# Store data in array
# _Acc: 2D Array
_Acc = [Convert2Acc(EW1_gal), Convert2Acc(NS1_gal), Convert2Acc(UD1_gal),\
       Convert2Acc(EW2_gal), Convert2Acc(NS2_gal), Convert2Acc(UD2_gal)]

Acc = np.array(_Acc).T # Acc: Transposed 2D array to write to .csv file

# Write to .csv file
with open('test.csv', 'w') as file:
    writer = csv.writer(file, lineterminator='\n')

    writer.writerows(Acc)

本当は,加速度を書き出すだけでなく,速度,変位,スペクトルを計算したいのですが,それらのプログラムは,随時,書き加えていきたいと思っています.

(参考)KiK-net, K-NETのASCIIフォーマット
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
Origin Time       2006/01/18 23:25:00<LF>         (1) 地震発生時刻
Lat.              37.798<LF>                      (2) 震央北緯
Lon.              142.200<LF>                     (3) 震央東経
Depth. (km)       36<LF>                          (4) 震源深さ
Mag.              5.7<LF>                         (5) マグニチュード
Station Code      MYG002<LF>                      (6) 観測点コード
Station Lat.      38.7262<LF>                     (7) 観測点北緯
Station Lon.      141.5109<LF>                    (8) 観測点東経
Station Height(m) 79<LF>                          (9) 観測点標高
Record Time       2006/01/18 23:25:46<LF>         (10) 記録開始時刻
Sampling Freq(Hz) 100Hz<LF>                       (11) サンプリング周波数
Duration Time(s)  108<LF>                         (12) 計測時間
Dir.              N-S<LF>                         (13) チャンネル
Scale Factor      3920(gal)/6182761<LF>           (14) スケールファクタ
Max Acc. (gal)    48.060<LF>                      (15) 最大加速度
Last Correction   2006/01/18 23:25:31<LF>         (16) 最終校正時刻
Memo.             <LF>                            (17) 備考
    8009     9006     7998     8001     8009     8007     8002     8005<LF>
    8006     8003     8003     8005     8005     8003     8001     8004<LF>
    8008     8004     7998     8002     8009     8005     8001     8002<LF>
 :
 :
 :
    8005     8003     8000     8004     8010     8008     8001     8001<LF>
    8006     8006     8000     8000     8005     8009     8004     7999<LF>
    8003     8007     8004     8000     8000     8005     8009     8005<LF>
[EOF]
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8

1 件のコメント :

  1. とても参考になりました.
    プログラミングも地震工学も初学者ですので,参考になるブログを発見し興奮しています.
    これからもこのブログ拝見させていただきます.

    返信削除