この記事は 防災アプリ開発 Advent Calendar 2025 の1日目の投稿です。
はじめに
筆者はArduinoと加速度センサを使った自宅での簡易的な地震観測(「おうち地震観測」と呼んでいます)をちまちまと行っています。過去のアドベントカレンダー投稿である 加速度センサ5種の震度計測結果の比較(2024年版) もその派生です。
将来的には、全国各地でおうち地震観測が行われ、震度データや地震波形データを相互に活用できる未来があると面白いななどと妄想をしています。
そこで1つ気になるのは、どいった地震波形データフォーマットを利用するかという点です。
正直よく分かっていないのでメモ程度にまとめつつ、そのなかでは一番知っているSACフォーマットについて概説します。
地震波形データフォーマット
概ね、国内に閉じたWINと、グローバルなSAC/SEEDに対比されます。
| フォーマット | 説明 | 筆者印象 |
|---|---|---|
| WIN1 (WIN322) | 東京大学のWINシステムで使われるデータフォーマットで、特に防災科研が拡張したものがWIN32フォーマット | 防災科研から強震データを落とすと、だいたいこれになる印象 |
| SAC3 | 米国地震学連合(IRIS)にて配布される波形解析ツールSeismic Analysis Code(SAC)で使われるデータフォーマット | 学術領域では最も普遍的に使われている印象 |
| SEED (miniSEED)4 | 国際デジタル地震計ネットワーク連合(FDSN)が世界標準として提唱したデータフォーマットで、時系列データとメタデータのうち主に前者が中心になったものがminiSEEDフォーマット | あまり知らない |
SACフォーマットを扱う
Seismic Analysis Code (SAC) で地震波形を扱うためのデータフォーマットです。
SACは米国地震学連合(IRIS)のページにダウンロードの案内がありますが、米国商務省の輸出規制の影響で、主に研究機関からの利用申請が必要となっています。
本投稿ではSAC自体は利用せず、そのフォーマットのデータのみを扱います。
入手
IRISのイベント検索ページ https://ds.iris.edu/wilber3/find_event から、実際の地震波形データを入手できます。
ここでは2025年11月9日に発生した三陸沖の地震を探索し、そのうち北海道えりも町にあるERM観測点を選択してデータを入手します。
適当に地図で領域を選択したのち、右下の「Request Data」を押します。データはメールで送られてきます。

例えばtarファイルでデータを受け取り、それを展開すると、以下のように .SAC 形式のファイルと IRISDMC ディレクトリ以下のファイルがあります。
.SAC ファイルはそのままSACファイルです。IRISDMC 以下のファイルは、ファイルごとに地震計の種類やサンプリング周波数などのメタデータが入っています。
SACファイルが6つありますが、メタデータを見ると、2つの地震計において南北、東西、上下の3成分波形を収録していることがわかります。
描画
本投稿では、様々な地震波形データフォーマットを扱えるPythonモジュール ObsPy を利用します。
シンプルに、以下のPythonスクリプトを書きます。
from obspy.core import read
st = read("./II.ERM.00.BH1.M.2025.313.080319.SAC")
st.plot()
適当に script.py などの名前でSACファイルのあるディレクトリに保存して、実行します。
python script.py
小さくて見づらいですが、成分や時刻についても描画されていることが分かります。これはSACファイルが時系列データのほかに、成分名や観測時刻などのメタデータも含んでいるためです。
以下のようなスクリプトで、メタデータを出力できます。
from obspy.core import read
st = read("./II.ERM.00.BH1.M.2025.313.080319.SAC")
print(st[0].stats)
実行すると、以下のように情報が含まれていることが分かります。
network: II
station: ERM
location: 00
channel: BH1
starttime: 2025-11-09T08:03:19.019538Z
endtime: 2025-11-09T08:14:18.969538Z
sampling_rate: 20.0
delta: 0.05
npts: 13200
calib: 4013060000.0
_format: SAC
sac: AttribDict({'delta': np.float32(0.05), 'scale': np.float32(4013060000.0), 'b': np.float32(0.000538), 'e': np.float32(659.95056), 'o': np.float32(17.980461), 'stla': np.float32(42.015), 'stlo': np.float32(143.1572), 'stel': np.float32(40.0), 'stdp': np.float32(0.0), 'evla': np.float32(39.3957), 'evlo': np.float32(143.4108), 'evdp': np.float32(10.0), 'dist': np.float32(291.72998), 'az': np.float32(355.868), 'baz': np.float32(175.70322), 'gcarc': np.float32(2.623707), 'cmpaz': np.float32(359.9), 'cmpinc': np.float32(90.0), 'nzyear': np.int32(2025), 'nzjday': np.int32(313), 'nzhour': np.int32(8), 'nzmin': np.int32(3), 'nzsec': np.int32(19), 'nzmsec': np.int32(19), 'nvhdr': np.int32(6), 'npts': np.int32(13200), 'iftype': np.int32(1), 'leven': np.int32(1), 'kstnm': 'ERM', 'kevnm': 'Off EastCoast O', 'khole': '00', 'kcmpnm': 'BH1', 'knetwk': 'II', 'kinst': 'Metrozet'})
加工
メタデータにはサンプリング周波数の情報も含んでいるため、フィルタリングも簡単にできます。
たとえばCMT解の解析に用いられるような、周期20-50秒の波形を抜き出しましょう。
from obspy.core import read
st = read("./II.ERM.00.BH1.M.2025.313.080319.SAC")
fmin = 1.0 / 50.0 # 0.02 Hz
fmax = 1.0 / 20.0 # 0.05 Hz
st_filtered = st.copy()
st_filtered.filter("bandpass", freqmin=fmin, freqmax=fmax, corners=2, zerophase=True)
st_filtered.plot()
実行すると、以下のような図が描画されます。
F-netのMT解ページ https://www.fnet.bosai.go.jp/event/joho.php?LANG=ja でよく見るような綺麗な波形ですね。
といった感じで、SACフォーマットは描画や加工がさくっと出来ます。
おわりに
最後はObsPyの解説にもなっていますが、このように地震波形データフォーマットには複数あり、そのうちSACフォーマットは実際に波形をダウンロードしたり簡単に加工したりできる環境が整っていて便利です。
今後やる気があればminiSEED版の記事も書いてみたいです。やる気があれば。


