
简介面向海洋学与水文学研究人员的潮汐潮位特征值提取MATLAB脚本用于从长时序潮位观测数据中自动识别高潮位、低潮位并计算潮差可服务于海洋环境监测、航海安全、水利工程及海洋资源开发等场景对需要批量处理验潮站数据的工程师和科研人员尤为适用。压缩包共1个文件即Tide.m脚本整个rar包仅1KB轻量易用适合刚接触潮汐分析的初学者快速建立完整流程也便于有经验的研究者按需修改算法细节。目前已有1893人学习下载。脚本覆盖了从数据读取支持CSV/TXT格式时间序列、缺失值与异常值检查、插值平滑预处理到高潮低潮极值定位、对应时间戳获取、潮位曲线绘制并将结果整理导出到Excel的完整流程。用户拿到后替换数据文件即可运行还可结合注释调整逻辑用于教学演示或日常科研中的潮汐特征快速提取。 干水文监测和海洋工程的同行应该都有这种体会验潮站辛辛苦苦攒了一年甚至几年的潮位数据拿到手里就是一条上下起伏的曲线但真到了写报告、做设计、出论证的时候这条曲线没法直接交差。你得把这条曲线“榨”成某个最高潮位、平均高潮位、平均海平面、最大潮差之类的数字这就是潮汐潮位特征值提取。说白了潮位原始记录只是素材特征值才是工程和科研真正能用的产品。这篇内容我会围绕特征值提取的完整链条来写先讲这些特征值到底服务什么场景再讲数据预处理和基准面这些容易被忽略的“地基活”接着拆手工挑取、程序化极值提取和调和分析三种方法最后把我在实际项目里踩过的坑和一套可复用的批量处理流程分享出来。适合刚接触潮汐分析的在校学生也适合需要自己处理验潮站数据的技术人员。1. 潮位特征值不是“读出来”的是“抠出来”的1.1 一条潮位曲线背后的三维信息潮位观测记录看起来只是一列时间戳加一列水位高度但里面包含的信息维度比表面看起来多得多。首先是天文潮的周期性半日潮每天两次高潮两次低潮日潮则一天一次混合潮更是高高低低没个准头。其次是气象水文因素叠加风暴潮抬升水面、河流径流改变近岸水位、气压变化导致海面起伏。再加上仪器噪声和人为干扰真实潮位序列是一锅“信号噪声异常”的汤。特征值提取的任务就是从这锅汤里把具有物理意义和统计价值的水位特征挑出来。挑出来的东西通常分三类一类是瞬时极值比如某个时间段内的最高潮位、最低潮位一类是统计特征值比如多年平均高潮位、平均低潮位、平均海平面还有一类是调和常数衍生值比如主要分潮的振幅和迟角以及由此算出的理论最高潮位、理论最低潮位。这三类特征值服务的目标完全不同提取方式也各有侧重。1.2 特征值在工程与科研中的用途分级不同项目对特征值的要求不一样理解这个分级能帮你决定该花多少精力在精度上。工程设计类港口码头高程设计需要设计高潮位海堤、防波堤的顶高程需要极端高水位跨海桥梁的梁底高程需要多年一遇高潮位。这类场景对极值的准确性极其敏感差个十几厘米可能就是“淹不淹”的区别。航道疏浚类乘潮水位决定了大型船舶能否在低潮时进出港所以需要统计低潮累积频率曲线、潮位历时曲线这类特征值计算的本质是水位时间分布的累积概率。生态与环境评估潮间带生物栖息的淹没时间、盐沼植被的耐淹范围需要平均高/低潮位以及特征潮位持续时间。科研与预报调和分析得到的各分潮调和常数用于潮汐预报、天文潮推算和长期海平面变化研究。这类特征值不是直接从曲线里挑极值而是通过数学分解得到。我的经验是拿到提取任务先问一句“给谁用”。向工程设计方向走重点盯着多年极值重现期向科研方向走重点盯着调和分析和基准面一致性。需求不同哪怕原始数据完全一样最后的成果表也完全不同。2. 先把数据的“底子”收拾利索基准面与质量控制2.1 原始潮位记录里的常见脏数据及其处理很多新手拿到验潮站原始数据就直接写程序找极大值极小值这个习惯很危险。潮位观测仪器常年泡在海里风吹浪打、船碰锚挂、生物附着数据质量远没有想象中干净。常见的脏数据有这么几类孤立野值比如一个浪头打在压力式水位计上瞬时值突然高出正常潮位一两米。这类数据在极值提取时会被误判成“最高潮位”。连续缺测仪器故障、换电池、传感器维护都可能导致几小时甚至几天的数据连续缺失。缺测对极值统计的影响非常大尤其缺的正好是天文大潮期间。平台期数据干出潮位计在低潮时段露出水面数值停在固定值上不动或者水位计零点漂移整段数据抬升或下沉。时间戳异常采样间隔不固定、重复记录、跳变这些表面小问题会在后续极值检测里造成双峰或漏检。处理原则我是这样把握的野值用中值滤波或相邻点斜率判据剔除不能简单删除要标记成无效值缺测段要记录起止时间后面统计分析做“空洞处理”平台期数据根据该站潮汐类型判断是否真实干出时间戳问题必须先重采样成等间隔序列。所有的清洗动作都要保留处理日志因为特征值表里的任何一个奇怪数字审计时都需要能追溯到原始记录。2.2 基准面统一特征值提取前最容易被忽略的工作潮位高度的绝对数值取决于基准面定义。同一个测点如果以理论最低潮面为基准和以黄海平均海平面为基准得到的特征值可能差出一两米。很多项目出问题不是提取算法不对而是把不同基准面的数据焊在一起比高低。实际工作中要做的基准面核对包括三件事确认原始数据采用的基面是验潮站当地理论最低潮面、国家高程基准还是某个工程本地基面检查长期平均海平面是否有阶段性突变这可能暗示基面转换或水准点沉降在成果表中明确标注所有特征值对应的基面名称和转换关系。我自己习惯在每个特征值表旁边附一张基准面关系说明写明“本站基面与1985国家高程基准的差值”“与理论最低潮面的差值”等。别嫌麻烦这个备注在项目评审时能省掉大量解释工作。3. 从极值挑取到调和分析核心提取方法的演进3.1 手工挑取与极值法的操作逻辑在自动化和数字化工具普及前老一辈技术人员拿到潮位纸带记录是用尺子在纸条上量高潮位、低潮位。后来有了Excel大家把逐时潮位数据导入表格用“数据—筛选—最大值”的方式逐月挑极值。这种手工极值挑取法的基础逻辑很简单在连续潮汐曲线里找每一个“峰”和每一个“谷”。但手工挑取有两个致命短板。第一个是潮汐不规则的测站非常难判半日潮正规时两个高潮两个低潮很规律到了日潮混合潮区域可能出现“低高潮”“高低潮”这种峰谷幅度不明显的点手挑时很容易看走眼或者标准不一致。第二个是数据量大以后效率极低一年逐时数据有8760个点要逐潮分析得盯屏幕很久。所以现在我做项目手工挑取只用于小范围抽查验证核心数据全部交给程序化方法。3.2 程序化提取高/低潮的完整流程程序化提取的本质是把“找极值”这个动作转成数值算法。我常用的路径是先将原始潮位序列线性插值成等时间间隔序列常用1分钟或5分钟采样如果原始是逐时数据也可以直接用用Butterworth低通滤波器滤除周期小于2小时的短周期波动避免风浪造成的毛刺影响在滤波后的序列上用一阶差分符号变化判断峰谷或用scipy.signal.find_peaks直接搜索对相邻峰谷做配对计算涨潮历时、落潮历时、潮差等派生特征值结合天文潮预报结果对每个极值点标注对应的潮汐类型高高潮、低高潮、高低潮、低低潮。find_peaks虽然方便但要注意distance和prominence参数的设置。距离参数至少设为典型潮周期的一半比如半日潮区设成6小时否则一次潮汐过程可能被横向噪声拆成好几个峰。突出度参数则能帮助滤掉叠加在潮汐曲线上的小扰动。核心代码大致长这样import numpy as np from scipy.signal import find_peaks, butter, filtfilt from datetime import datetime def load_tide_data(filepath): # 读取时间、水位两列返回t(小时)、z(米) pass def clean_and_filter(t, z, cutoff_h2.0, fs_h1.0/60.0): # 先用中值滤波剔除野值再低通滤波 z[np.abs(z - np.median(z)) 5] np.nan z np.interp(t[~np.isnan(z)], t, np.nan_to_num(z)) # 简化插值示意 b, a butter(4, 2 * cutoff_h * fs_h, btypelow) return filtfilt(b, a, z) t np.arange(0, 365*24, 1/60) # 一年逐分钟 z load_tide_data(station_2023.csv) zf clean_and_filter(t, z) # 潮周期约12.4小时距离参数设6小时即360分钟 peaks, props find_peaks(zf, distance360, prominence0.1) troughs, _ find_peaks(-zf, distance360, prominence0.1) # peaks为高潮索引troughs为低潮索引跑完之后不能直接信结果我会把提取出的峰谷点画在原始曲线上肉眼抽查几个大潮时段和无潮时段。程序挑极值最怕的是把滤波后的虚假振荡当成真极值抽查能兜住这一类错误。3.3 调和分析把特征值变成可预测的物理参数极值提取回答的是“过去某段时间里潮位到过多高”调和分析回答的是“未来一般情况下潮位会怎么变”。两者的关系像是“历史账单”和“收入模型”。调和分析的核心思想是把实测潮位看成若干个已知频率分潮的叠加用最小二乘法拟合出每个分潮的振幅和迟角。常用的分潮包括M2、S2、N2、K1、O1、P1、Q1等它们的角速度由天体运动规律确定。拟合得到调和常数后不仅能还原历史潮位还能预报未来潮位更可以推算出理论最高潮位、理论最低潮位、平均大潮差等“准特征值”。实操层面成熟的工具很多经典的T_TIDEMatlab、UTide以及Python生态里的pyTide。我自己偶尔也直接用numpy.linalg.lstsq手动构造分潮矩阵来拟合主要目的是完全控制权重处理和时间基点的定义。但日常项目用现成工具更稳关键是检查观测序列长度能否分辨邻近频率分潮。一个月数据能分出主要半日潮和全日潮一年数据才能稳定分出M2和N2这种频率很接近的分潮。短序列强求分潮数越多拟合出来的迟角越不可信。4. 实操中的翻车点与排查思路4.1 日潮不等下“低高潮”和“高低潮”该不该算正规半日潮海区一天两个潮高高兴兴地挑两个峰两个谷就行。但很多站位不是正规半日潮尤其在中国南海、北部湾以及部分河口区日潮不等现象非常突出两个高潮一高一低两个低潮也一高一低。程序找极值找到的是四个峰谷可怎么区分“高高潮”和“低高潮”如果直接全算进高潮统计平均高潮位会被拉低。我的处理办法是先做调和分析判断该站的潮型判别数即(K1O1)/(M2S2)的比值大于0.5的站位倾向于日潮不规则此时要把每天的高潮分成“高高潮”和“低高潮”两组分别统计。特征值成果表里也要注明“本次统计的高潮指每日高高潮”避免后续使用方产生歧义。4.2 风暴潮期间极端值怎么剔怎么留台风过境时潮位曲线会突然抬升一两米这时候程序照样会把它识别为一次高潮。问题是做多年极值统计时风暴潮增水引起的异常高潮位到底是“真实极值”还是“异常值”从防洪防潮角度这恰恰是最该关注的极值从天文潮统计角度它又偏离了天文潮的正常包络。正确的做法是把“天文潮位”和“实测潮位中的增水成分”分开。先利用调和常数计算同一时段的天文潮实测潮位减天文潮位得到余水位增水序列然后定义风暴潮事件为余水位超过某一阈值比如台风影响期间余水位超过50厘米的连续过程。特征值提取时实测潮位的极值用于极端水位统计而天文潮极值用于常规潮汐特征值。两者都要保留但目录上要分开写。4.3 长序列数据中的基准漂移与趋势误判连续十几二十年的验潮站数据最怕的是基准面悄咪咪地变了。地基沉降、验潮井改造、水准点破坏都会让长期序列出现台阶状跳变。如果无视这些跳变直接提取均值、算趋势结论会非常离谱。排查方法很简单对月平均海平面序列做突变检验如Mann-Kendall法、滑动t检验发现突变年后对照台站维护日志看那一年是不是发生过设备或基准变动。存在系统性跳变的序列要分段处理并在报告中说明。长期趋势分析只基于统一基准面的子序列进行否则永远不知道你算的“海平面上升速率”里有多少是仪器沉降造成的。5. 一套我常用的批量提取流程示例5.1 数据清洗与切片我把整个流程做成三截。第一截是清洗模块读入原始逐分钟潮位先做范围检查超过站址高程极端误差范围的直接标无效再做差分跳变检测最后线性插值成整点序列。这个环节输出一个净化的连续序列station_hourly.csv同时生成一个缺测标记文件注明哪些时段是无效数据。清洗时特别要注意边缘时段。程序滤波在序列两端会产生边界效应处理长序列时我会前后各延长若干小时数据滤波完再切掉保证有效段没有畸变。5.2 基于Python的极值提取第二截是提取模块读入连续小时序列按日窗口切分在每24小时窗口内找极大值和极小值再对边界处的重复检测做去重。为了方便做潮型判别模块同时调用调和分析函数输出主要分潮调和常数。这里我有个小技巧提取极值前先用“移动平均剔除增水成分”得到“准天文潮曲线”在准天文潮曲线上找峰谷再反查原始曲线上对应时刻的真实潮位。这样既能精确控制极值时刻又能兼顾风暴潮期间极端水位的捕获。def extract_tide_features(df, peak_distance_h6): z df[level].values t df[time].values # 滑窗低通细节省略得到基本面序列 base peaks_idx, _ find_peaks(base, distancepeak_distance_h*60) # 在原始z上取对应值 features [] for pi in peaks_idx: features.append({ time: t[pi], type: H, level_orig: z[pi], level_base: base[pi] }) return features5.3 成果输出与报告组织最后一截是汇总模块按月、按年、按全部序列分别统计平均高潮位、平均低潮位、平均海平面、最大潮差、平均大潮差、涨落潮历时等。我习惯直接生成三张表逐潮特征值表每条峰谷一行包含时间、类型、特征值、原始水位、滤波水位、备注分月统计表每月的高潮均值、低潮均值、极值、潮差年报特征值表全年极值、平均特征值、调和常数、设计需要的重现期推算结果。输出格式上Excel适合给设计院同事看CSV适合后续科研统计。但无论哪种格式我都会附上“特征值说明页”写清楚基准面、数据来源、缺测情况、处理方法。这个习惯救过我很多次报告评审时被问数据出处和数据口径直接翻说明页就能答。潮汐潮位特征值提取这个活看起来只是找找极大值极小值真正做起来却是“数据质量基面逻辑物理判断算法实现”的综合功夫。尤其是程序和人工判断结合的部分不同测站、不同潮型、不同使用场景都会带来差异化细节。我个人最深的体会是永远不要把特征值提取当纯计算题——它首先是物理题其次才是编程题。先把潮汐类型、基准面、数据缺陷这些底账盘清楚再上算法结果才经得起推敲。你也别嫌这些前期工作繁琐真正到了项目评审和成果应用环节就知道这里省下来的每一分钟后面都会以更贵的代价补回来。本文还有配套的精品资源点击获取