取り扱い(図化することを想定)上,記録にスケールファクターを乗じて変換した方が扱いやすいので,変換結果を.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
とても参考になりました.
返信削除プログラミングも地震工学も初学者ですので,参考になるブログを発見し興奮しています.
これからもこのブログ拝見させていただきます.