3. 海洋数据中的时间系统基础
在海洋观测数据中,时间字段几乎出现在每一条记录里:CTD 剖面有投放时刻,浮标有逐小时采样时刻,ADCP 有每个 ensemble 的起始与结束时间,卫星遥感产品有扫描行时间。时间看似只是一个数字,但它背后绑定着一套时间标准、一个历元起点和一种编码格式。三者中任何一处理解错位,都会让数据在时间轴上整体平移,进而影响潮汐分析、事件对齐、轨迹推算等下游工作。本节围绕“常用时间标准—时间戳与格式—海洋观测时间记录特点与常见问题”这条主线展开。
一、四种常用时间标准及其换算关系
海洋数据中最常遇到的时间标准有四种,它们都以“秒”为基本单位,但起点和是否含闰秒不同。
UTC(协调世界时)是民用与科研的通用基准,它通过闰秒使原子时与地球自转保持接近。UTC 的秒长均匀,但会不定期插入闰秒,因此 UTC 不是严格连续的。
TAI(国际原子时)由原子钟加权平均产生,严格连续、无闰秒。TAI 与 UTC 的差值为整数秒,即 TAI − UTC = 37 s(自 2017 年 1 月 1 日起)。这个差值随闰秒增加而增大,历史数据必须查表确定当时的差值。
GPS 时由 GPS 系统建立,起点为 1980-01-06 00:00:00 UTC,同样连续无闰秒。GPS 时与 TAI 相差固定 19 s,因此 GPS 时与 UTC 的差值为 18 s(2017 年后)。许多海洋浮标、GPS 漂流浮标和船载 GNSS 记录直接使用 GPS 时。
本地时是 UTC 加时区偏移,可能还叠加夏令时。海洋调查船常按船时记录,近岸台站常按当地标准时记录,这类时间必须连同时区信息一起保存,否则无法还原。
换算的关键是记住两条固定关系和一条变动关系:GPS 时 = TAI − 19 s;TAI = UTC + 闰秒累计值;本地时 = UTC + 时区偏移(+ 夏令时)。前两条是常数,第三条随闰秒表变化,必须按数据时刻查表。
二、时间戳与日期时间格式
时间戳是把时刻编码为一个数值的表示方式,常见两类。第一类是Unix 时间戳,定义为自 1970-01-01 00:00:00 UTC 起经过的秒数(或毫秒数),它本身基于 UTC,但通常忽略闰秒,因此严格说它是“类 UTC”的连续计数。第二类是GPS 周与周内秒,即自 1980-01-06 起的周数(week)加周内秒(tow),这是 RINEX、NMEA 及许多 GNSS 相关海洋数据文件的原生格式。
日期时间格式方面,文本记录常用 ISO 8601 形式,如 2024-06-01T08:30:00Z,末尾的 Z 表示 UTC;若写成 +08:00 则表示东八区本地时。NetCDF 与许多海洋数据产品采用“单位 + 起点”的编码,例如 seconds since 1970-01-01 00:00:00 或 hours since 1950-01-01,读取时必须解析单位与起点,否则数值毫无意义。MATLAB 的 datenum、Python 的 datetime、Excel 的序列日期各有自己的历元,跨工具交换时尤其容易出错。
实践中的稳妥做法是:内部统一用 UTC 的 ISO 8601 字符串或 Unix 时间戳存储,只在展示层转换为本地时;文件头或属性中显式写明时间标准、历元起点和单位。
三、海洋观测时间记录的特点
海洋观测的时间记录有几个鲜明特点。其一,采样间隔不规则:CTD 剖面是事件型记录,一次投放只有几分钟到几小时;锚系浮标多为 10 min 或 1 h 等间隔,但会因通信重传出现缺测;ADCP 的 ensemble 间隔可设为 10 min,但每个 ensemble 内部又有 ping 级时间。其二,多时钟并存:船载系统用船时,仪器内部用 GPS 时或仪器自身时钟,卫星通信链路又带自己的时间标记,同一航次的数据可能混用多种标准。其三,时间精度要求差异大:潮汐调和分析要求分钟级甚至秒级对齐,而季节尺度环流分析对小时级误差不敏感。其四,时间常与位置绑定:漂流浮标的每个时间点对应一个经纬度,时间错位会直接表现为轨迹“跳跃”。
四、常见问题与排查方法
实际数据中最常见的时间问题可归为四类,排查时可按“先看格式、再查标准、后验连续性”的顺序进行。
- 时区混用:船时未标注时区,被误当作 UTC 读入,导致整体偏移 8 h 或更多。表现为潮位相位整体错位、事件与卫星过境时刻对不上。排查:检查文件头是否有
TZ、timezone属性,对比同一事件在多个来源中的时刻。 - 闰秒处理不一致:部分软件把 GPS 时直接当 UTC 用,产生 18 s 固定偏差;跨闰秒时刻的数据若未查表,偏差会再增加 1 s。排查:用已知的闰秒日期做对照,检查 TAI−UTC 是否按表取值。
- 历元起点误读:NetCDF 中
days since 1950-01-01被当作 Unix 秒处理,结果偏差数十年。排查:读取units属性并显式解析。 - 时钟漂移与重复记录:仪器时钟未同步导致逐渐漂移;通信重传造成同一时刻重复出现。排查:绘制时间差分序列,正常应围绕标称间隔波动,出现负值或异常大值即为异常点。
下面给出一段 Python 示例,演示如何把 GPS 周/周内秒转换为 UTC,并检查时间序列的连续性。示例中的数值为教学假设值,实际使用时应以数据文件中的真实记录为准。
from datetime import datetime, timedelta
# 教学示例:GPS 周与周内秒(假设值)
gps_week = 2317
tow = 345600.0 # 周内秒
# GPS 历元:1980-01-06 00:00:00 UTC
gps_epoch = datetime(1980, 1, 6)
t_gps = gps_epoch + timedelta(weeks=gps_week, seconds=tow)
# 2017 年后 GPS 时 - UTC = 18 s
t_utc = t_gps - timedelta(seconds=18)
print(t_utc.isoformat() + "Z")
# 连续性检查:相邻时间差
times = [t_utc + timedelta(minutes=10*i) for i in range(5)]
diffs = [(times[i+1] - times[i]).total_seconds() for i in range(len(times)-1)]
print(diffs) # 正常应全为 600.0,出现负值或异常大值需排查
运行后应得到形如 2024-06-01T00:00:00Z 的 UTC 时刻(具体结果取决于示例参数),时间差列表应全为 600.0。若出现负值,说明记录顺序或时钟回拨有问题;若出现远大于 600 的值,说明存在缺测段,需要在后续分析中标记。把这类检查固化为数据预处理的第一步,可以避免绝大多数时间错位问题向下游传播。