CnOpenData中国地震基本信息表:从数据清洗到地震时空分析实战
做区域地震研究的人大概都有过一段找数据找到崩溃的经历。中国地震台网中心、国家地震科学数据中心这些公开渠道的数据虽然权威但下载流程繁琐、字段格式不统一不同时间段的数据口径还会变尤其是想要一个“开箱即用”的长时段历史地震目录时往往得自己翻好几个网站、拼好几张表。我去年做华北地区地震活动性分析时就卡在这一步后来用了CnOpenData这个平台上的中国地震基本信息表才算是把数据底子打扎实了。这篇文章就围绕这份数据集把它的字段结构、数据口径、实际研究中的落地用法以及我自己在使用过程中踩过的坑一次说清楚。1. 做区域地震研究时数据从哪来——一个真实的找数困境先说个背景。当时我需要研究1970年以来华北地区的地震时空分布规律第一步就是拿到一份完整、规范的地震目录。所谓“地震目录”简单说就是一张大表里面每一条记录对应一次地震事件关键字段至少包含发生时间、震中经纬度、震级、震源深度最好再带一个参考地名。这个需求听起来很基础真做起来才发现处处是坑。公开渠道的问题主要有三个数据分散。中国地震台网的历史速报目录、地震科学数据中心的观测报告、部分省局的地震目录格式都不一样有的给文本文件有的需要在线查询后导出字段含义还不完全一致。口径不一致。同一场地震在不同目录里可能因为归属判断不同被标注为不同的震级或深度甚至时间都会差几秒。早期数据质量参差。上世纪七八十年代的仪器灵敏度、定位算法精度有限很多小震根本没记上震级在某个阈值以下的数据基本是断的。CnOpenData这个平台做的地理空间数据里有一份“中国地震基本信息表”主打的就是把分散的公开地震目录整理成结构化的表格。它的数据来源依据官方台网资料覆盖时间跨度较长字段做了标准化对做历史地震分析的人来说非常省事。我当时拿到这份数据后第一感受是终于不用在数据清洗上先耗掉三分之一的项目时间了。如果你也是做灾害风险、地学统计、GIS可视化相关工作的这份表值得好好了解一下。2. 中国地震基本信息表的字段拆解——每一列到底在说什么光说“整理好的地震目录”还是太模糊真正决定一份数据能不能用的是字段设计和数据口径。我以实测拿到手的情况为准把这份表的核心字段逐个过一遍。2.1 时间与空间字段事件的基础坐标表格里最基本的两个维度就是“什么时候”和“在哪”。地震日期/时间记录格式一般为标准时间字符串精确到秒。需要注意区分它是北京时间还是UTC时间。官方地震台网发布时通常用北京时间但部分原始观测数据用UTCCnOpenData整理后一般统一为一个时区要用前先确认一下避免做时间序列分析时对不上。震中经度/纬度十进制度格式比如 114.403、36.158 这种。这份数据的经纬度精度整体比较可靠但早期地震事件的定位误差客观存在尤其是七八十年代的记录误差可能到10-30公里量级。做精细空间分析时建议对数据质量有个心理预期。参考地名比如“河北唐山”“四川汶川”这种描述性地点方便快速理解大概区域但做精确落点分析时还是以经纬度为准。2.2 震级字段最容易理解错的地方震级是所有人最关注的字段但也是口径最需要留神的字段。表格里通常会有一个震级字段数值形如 5.2、6.3 等。但地震学里震级并不只有一种地方性震级ML、面波震级MS、体波震级mb、矩震级Mw各有各的定义和适用场景。中国地震台网的历史速报目录里中强震常用面波震级MS口径5级以下的小震多用地方性震级ML。这两者数值大体可比但又不能完全等同。换算关系是经验性的不同研究给出的公式略有差异不做严格地震学分析时可以近似认为一致做严谨研究时必须注意。更麻烦的是早期震级是用模拟记录估算的晚近数据则是数字台网直接测算精度提升的同时也会导致统计口径的细微断裂。这也是为什么很多地震活动性研究只取某个时间段之后的数据分析“完整性震级以上”的事件。2.3 震源深度与其他补充字段震源深度单位一般是公里。浅源地震0-70km、中源70-300km、深源300km都有覆盖国内地震以浅源为主。这个字段的测量误差在早期数据里相当大有些记录的深度是零或干脆缺测使用时要批量处理。其他补充信息部分版本还会带烈度、是否属于余震序列等标注。但你不能指望它是完整批注——地震目录的本质是事件记录余震判定往往需要结合主震事件和前震序列单独分析。提示拿到表之后第一步永远是画一条“字段清单口径确认”的excel把每个字段的来源、单位、时间格式、国标要求核对清楚。这个工作省不得后面所有分析的可信度都建立在它上面。3. 这份数据能做什么研究——三个典型落地场景很多读者会问光有一张“地震基本信息表”又能怎样其实它的价值高度依赖你的研究问题和分析方法。我根据自己的使用经验讲三个最能直接上手的场景。3.1 场景一区域地震时空分布规律分析这是最基础也最出成果的方向。拿到表格后按照经纬度框选出目标区域比如华北平原、川滇地区再按时间维度做统计可以输出年频次曲线看区域地震活动有没有周期性变化月度/季度分布看季节性信号部分区域确实有观测到与水文载荷相关的微弱季节性波动震级-频度关系也就是b值估计b值反映了区域大小地震的比例是地震活动性研究里的经典指标我当时写了一段Python脚本用Pandas把数据按年份聚合后直接画出了华北地区1970年以来每年3级以上地震的频次直方图。图一出来历史地震活跃期的轮廓一下清晰了——1966年邢台地震序列后的余震衰减、1976年唐山地震后的活跃度抬升全都直观地展现出来。这种图表放在论文、报告里作背景交代非常能说明问题。3.2 场景二结合GIS做震中空间分布可视化地震数据天生适合做空间可视化。用CnOpenData的震中经纬度字段叠加行政区划、活动断裂带、人口密度等数据可以做震中核密度热力图识别地震活动的高发地带震中与断裂带距离分析量化地震活动与地质构造的关系历史强震空间序列图按时间播放在地图上看地震活动的迁移过程技术实现上可以用GeoPandas读经纬度生成GeoDataFrame再用Matplotlib或Leaflet做分层设色渲染。震级大小决定圆点半径深度决定颜色深浅一张能放进汇报幻灯片里的专业地图就出来了。3.3 场景三作为灾害风险评估模型的输入做建筑物抗震设防、城市基础设施韧性评估、保险定价模型时历史地震目录是绕不开的基础输入。比较常见的用法是从完整的目录里提取特定区域、特定震级以上的“最不利事件集合”作为情景设定输入。比如“未来50年该区域可能遭遇的最大地震震级”这个参数可以基于历史目录峰值结合统计外推估算。再比如做地震保险产品定价需要知道目标区域的“震级-超越频次”曲线这就要靠目录数据做极值统计。没有一份长时段、干净的目录这些工作从头收集数据会非常痛苦。4. 数据拿到手之后的那些坑清洗、去重与口径统一这部分是全文的重点——因为不管数据整理得多规范它本质上仍然是对真实观测的记录不是理想化的分析就绪数据。我把自己实际操作中踩过的坑和对应解法列一下。4.1 重复记录一次地震出现多次条目拿到完整目录后先用df.duplicated()查一遍重复行会发现有少量完全重复或高度相似的记录。原因通常有两个主震和余震在编制目录时被拆成了多条同一次事件被不同台网子目录重复收录去重逻辑建议先按“时间经纬度”组合去重如果经纬度有微小偏差再用“时间差5秒且震级差0.2”的模糊匹配。注意余震不能盲目删——是否保留取决于你做分析的目的。如果是风险模型余震是客观发生的事件保留更合理如果做背景活动性分析可能需要剔除余震序列以减少丛集效应的影响。4.2 震级口径不统一老数据和新数据的“断层”这是最隐蔽的问题。同一份表里早年的5级地震和晚近的5级地震严格说不是同一个物理量的测量结果。我自己的处理办法明确说明研究的震级口径直接用表格上的震级字段但在方法学里标注“目录面波震级为主部分早期地方性震级未做严格换算”如果做严格的统计建模先做震级完整性分析确定Mc值低于该震级的数据认为是漏记的直接过滤掉避免用震级重定义的边界值做结论比如“5.0级以上是否增长”这种问题容易受口径变化影响4.3 深度缺测与零值处理震源深度字段里早期记录大量为0甚至有个别情况直接缺测。0深度并不代表地震发生在地表很多时候意味着仪器没有有效约束深度。处理方案做大样本统计时深度字段可以保留但说明零值意味着“无约束”做三维震源分布图时考虑对缺测深度做插值或删除处理千万不要把0深度当成“地表地震”去解读4.4 行政区域匹配的边界问题用参考地名做区域筛选经常出错因为“某某县”的范围在不同年代不一样行政区划调整很频繁。安全做法是只用经纬度做空间筛选行政区划边界数据另外找一份当时对应的区划数据。如果只是粗略分类参考地名可以作为辅助字段但别用于精确统计。5. 和台网公开数据相比CnOpenData版本值不值得用——我的取舍建议最后说一个大家最纠结的问题既然地震目录公开渠道也能下载为什么要用CnOpenData的付费/机构订阅版本我整理了一张对比表帮你判断对比维度公开台网原始目录CnOpenData地震基本信息表覆盖时间跨度视渠道而定早期数据分散统一整理跨度较大字段整洁度各渠道格式不一需大量清洗已经结构化字段标准化缺测与异常标注原始数据处理成本高有整理和补全仍需二次校验获取便利性多网站手动下载学习成本高单表下载随项目调用方便额外信息整合有限参考地名、震源参数等字段整合较好费用免费通常需要订阅或购买我的建议是如果你是个人研究、预算有限且时间跨度不长可以去公开渠道自己拼就当练手了。如果你的任务是做长时段、跨区域的分析或者做项目交付、商业报告直接上整理好的版本更划算。你的时间花在分析上而不是花在跟表格格式较劲上这件事本身就是最值得的投资。拿到任何商业数据后依然要做样本核对——随机抽几条记录和官方台网的信息比对一下确认数据没有出现系统性偏差。我习惯每千条记录随机抽10条做人工复核。6. 实操参考一份拷贝即用的Python数据快速上手模板我把自己调试过的数据处理流程简化成一个示例脚本覆盖“读取-清洗-区域筛选-时间聚合-可视化”基本路径你可以直接换上自己的文件路径和区域参数使用。import pandas as pd import matplotlib.pyplot as plt # 读取数据假设文件为CSV格式 df pd.read_csv(cnopendata_earthquake.csv) # 查看字段结构 print(df.columns.tolist()) print(df.head()) # 转时间格式 df[time] pd.to_datetime(df[time]) # 筛选目标区域华北经度110-125纬度30-44 region df[ (df[longitude] 110) (df[longitude] 125) (df[latitude] 30) (df[latitude] 44) ].copy() # 剔除缺失关键字段的行 region_clean region.dropna(subset[time, magnitude, longitude, latitude]) # 按年份聚合 region_clean[year] region_clean[time].dt.year yearly_count region_clean[region_clean[magnitude] 3.0].groupby(year).size() # 画年频次图 yearly_count.plot(kindbar, figsize(14, 5), colorsteelblue) plt.title(华北地区3级以上地震年频次1970-2024) plt.xlabel(年份) plt.ylabel(地震次数) plt.tight_layout() plt.show()再补一个用GeoPandas做震中分布图的最小示例import geopandas as gpd from shapely.geometry import Point gdf gpd.GeoDataFrame( region_clean, geometry[Point(x, y) for x, y in zip(region_clean[longitude], region_clean[latitude])], crsEPSG:4326 ) fig, ax plt.subplots(figsize(10, 10)) # 地图底图自行加载例如中国的省界shapefile # china_boundary.plot(axax, alpha0.3) gdf.plot( axax, markersizeregion_clean[magnitude] * 2, columnmagnitude, cmapYlOrRd, legendTrue ) plt.show()注意底图数据需要额外准备不同数据源授权的shapefile谨慎混用。建议用公开无限制的行政边界数据集。7. 我用了这份数据几轮之后的一些体会最后聊点实际体会不算总结就是给后续用这份数据的朋友提个醒。地震目录这类数据最大的价值其实不在于某几个字段有多精确而在于它让你的研究能在同一套口径下跑通所有步骤。CnOpenData这份中国地震基本信息表价值就在于省掉了中间环节的拼接和清洗让你能直接进入分析层面。但它终究是真实世界的观测记录不是人工构造的完美数据集。我的习惯是每一次分析前都花半小时做数据质量报告——看缺失值比例、看时间范围、看震级分布心里有数之后再往下走。我在实际使用中还有一个特别推荐的技巧拿到一张地震目录后先不要急着做复杂模型而是把所有年份的震级-频度关系b值做一张参考图。这个做法成本极低但它能帮你快速发现数据里有没有明显的口径跳跃——如果b值在某一年前后出现突变大概率是记录能力发生了变化而不是地壳活动真的出现了物理性的改变。这一点放在任何报告里写清楚审稿人也好、项目负责人也罢都会对你的数据处理能力高看一眼。如果后续你想深挖还可以把这份数据和活动断裂带数据、强震记录、宏观烈度资料做交叉分析纵向延伸出更加扎实的成果。数据本身是死的组合方式才是活的祝各位跑数据顺利。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →