时间变量

SAC 用于处理时间序列,其头段变量中与时间有关的也很多,总的来说分为 2 类:

  1. GMT时间:绝对时间,或参考时间,包括 NZYEARNZJDAYNZHOURNZMINNZSECNZMSEC, 分别代表年、日、时、分、秒、毫秒。注意这里没有月的概念,NZJDAY 代表该年的第多少天。 这 6 个变量构成了一个绝对时间,这个绝对时间以更易读的形式保存在变量 KZDATEKZTIME 中 (这两个变量虽然说是头段变量,但是在文件中实际上并不对应这两个变量的存储空间),其是 整个 SAC 文件中唯一的绝对时间,因而用作为参考时间去定义相对时间。
  2. 相对时间:包括 BEOAFTn 等等,这些相对时间的值都是相对于绝对时间来定义的。 O=100 即意味着发震时刻为参考时间加上 100 秒所对应的 GMT 时间。

测试

下面针对这些时间变量做一些测试,试着更深刻地理解 SAC 的时间。

原始数据

选取了一个地震的三分量,列出其 kzdatekztimebe 如下:

kzdate = MAR 11 (070), 2011
kztime = 05:46:23.019
b = 5.380000e-04
e = 4.499951e+03

修改文件起始时间 b

用如下命令直接修改文件起始时间

ch b 10

得到结果如下:

kzdate = MAR 11 (070), 2011
kztime = 05:46:23.019
b = 1.000000e+01
e = 4.509950e+03

文件的参考时间没有发生变化,be 都向后推迟了 10s,这意味着整段 SAC 数据任一点的绝对时间 延迟了 10s,因而这一点可以用来校正时间零飘以及时区差异(但是前提是当前文件中 oaftn 未定义)。

修改文件结束时间 e

用如下命令直接修改文件结束时间

ch e 0

得到结果如下:

kzdate = MAR 11 (070), 2011
kztime = 05:46:23.019
b = 5.380000e-04
e = 4.499951e+03

文件的参考时间以及 e 均没有发生变化,这意味着 e 的值不是可以任意改变的,而是根据 bdeltanpts 动态决定的,尝试修改 deltae 值随之改变;尝试修改 npts 以达到类似 cut 的效果时, 出现警告:

WARNING: NVHDR, NPTS, NWFID, NORID, and NEVID cannot be changed with CHNHDR

修改 o、a、f、tn

这些变量是用于标记时刻的变量,不是必须的,用户可以随意修改,不会对参考时间等产生任何的影响。

修改参考时间

随便定义了几个 oaft0 的值,以验证修改参考时间对这些时间变量的影响,原始变量值如下:

kzdate = MAR 11 (070), 2011
kztime = 05:46:23.019
b = 5.380000e-04
e = 4.499951e+03
o = 2.000000e+01
a = 4.000000e+01
f = 9.000000e+01
t0 = 6.000000e+01

用如下命令修改参考时间

ch nzmin 50

得到结果如下:

kzdate = MAR 11 (070), 2011
kztime = 05:50:23.019
b = 5.380000e-04
e = 4.499951e+03
o = 2.000000e+01
a = 4.000000e+01
f = 9.000000e+01
t0 = 6.000000e+01

整个 SAC 文件中除参考时间外其他时间都没有发生变化。参考时间变化了而相对时间没有变化,这导致 SAC 数据点的 绝对时间发生了平移,与第一条中直接修改 b 的情况类似。可以通过修改参考时间的方式来校正时钟漂移和时区差异, 当然一般不这么做。

修改参考时间为发震时刻

很多情况下,需要将参考时间修改为发震时刻,从第四条可以看出,直接修改参考时间的方案是不可行的。

当我们将参考时间提前 10s 的时候,为了保证其他时间变量所对应的绝对时间不发生变化,我们需要同时将各个 相对时间加上 10s(这样才能保证在某个参考时间下标记的震相到时等信息可以完全映射到另一个参考时间下的 震相到时,这或许可以理解为时间坐标系下的坐标变换)。

因为修改参考时间,而使得每个相对时间都要一一修改,这工作量有点大。SAC 自身提供了一个更为简单的选项 帮助我们实现了这一功能,如 manaul 中所说:“你可以使用 allt 选项改变这个参考时间和其他所有的相对时间, 这个秒数 t 增加到每个给定的相对时间上,同样的秒数也从参考时间中减去,这样就使数据实际的 GMT 时间保持不变”。

还是上面那个例子,使用

ch allt 10

得到结果如下:

kzdate = MAR 11 (070), 2011
kztime = 05:46:13.019
b = 1.000054e+01
e = 4.509951e+03
o = 3.000000e+01
a = 5.000000e+01
f = 1.000000e+02
t0 = 7.000000e+01

相对时间都增加了 10s,参考时间减少了 10s。

直接使用 GMT 时间

为方便起见,你可以输入一个 GMT 时间而不是输入一个相对时间。当输入 GMT 时间时,SAC 首先将其变为相对时间 再存储到头段变量中。已知某事件的发震时刻,想要将发震时刻作为参考时间,其他所有的相对时间都变成相对 这个参考时间的秒数,可以使用

ch o gmt 2011 070 05 50 23 019

得到如下结果:

kzdate = MAR 11 (070), 2011
kztime = 05:46:23.019
b = 5.380000e-04
e = 4.499951e+03
o = 2.400000e+02
a = 4.000000e+01
f = 9.000000e+01
t0 = 6.000000e+01

发震时刻被转换为相对时间 240 存储在头段变量 o 中,为了修改参考时间为发震时刻,需要将所有相对时间减去 240 s, 参考时间加上 240 s,命令为

ch allt -240 iztype io

结果如下:

kzdate = MAR 11 (070), 2011
kztime = 05:50:23.019
b = -2.399995e+02
e = 4.259951e+03
o = 0.000000e+00
a = -2.000000e+02
f = -1.500000e+02
t0 = -1.800000e+02

由结果可以看出,这么做达到了我们想要的目的。

总结

将 SAC 中的时间变量可以细分为三类:

  • 第一类为参考时间,即 NZYEARNZJDAYNZHOURNZMINNZSECNZMSEC
  • 第二类为相对时间,即 oaftn
  • 第三类为特殊的相对时间,即 be

在第三类中 e 是不能随意改变的,所以可以不考虑。单独修改这三类时间变量都不会影响其他时间变量,修改第二 类时间不会造成整个数据的绝对时间的改变,修改第一、三类时间变量时数据绝对时间会发生改变(该特性可用于 校正时间零漂或时区不一致)。为了保证数据的绝对时间不发生改变,通常使用 allt 选项来实现。