之前整理一批區域地震目錄,想畫深度分布圖,用 Python 的 matplotlib 直接吃 CSV。環境是 Python 3.11、pandas 2.x、matplotlib 3.8,資料量約 4 萬筆,欄位有時間、經緯度、規模、深度。
一開始直接 df['depth'].hist(bins=50),圖出來在 0 公里附近有一根異常高的柱子,高到把其他分布壓扁。查了才發現深度欄位有兩種異常:一是空值,二是固定填 0 的「深度未知」紀錄。兩者混在一起,畫圖就失真。
我的做法是先做欄位清理,再畫:
import pandas as pd
df = pd.read_csv('catalog.csv')
df['depth'] = pd.to_numeric(df['depth'], errors='coerce')
# 先看空值與 0 值各有多少
df['depth'].isna().sum()
(df['depth'] == 0).sum()
# 把 0 當成未知,跟空值一起排除
mask = df['depth'].notna() & (df['depth'] > 0)
clean = df.loc[mask, ['time', 'lat', 'lon', 'mag', 'depth']]
clean['depth'].describe()
畫圖前我也會固定 bin 的邊界,避免不同批次資料自動調整區間,導致兩張圖看起來不能比:
import numpy as np
bins = np.arange(0, 301, 10)
clean['depth'].hist(bins=bins)
為什麼這樣做:深度 0 在目錄裡常常不是真的「震源在地表」,而是沒有深度解。直接當數值用,會讓 0 到 10 公里這格被大量未知值灌爆。先數清楚空值與 0 值,比事後看圖猜原因可靠。代價是會損失一批紀錄,如果那批剛好是某段時間的主要事件,分布形狀就會偏,所以我會把排除筆數印出來,跟原始筆數對照。
失效的地方有幾個。第一,有些目錄用負值或特定代碼表示未知,只擋 > 0 會漏掉。第二,淺源地震真的可能很淺,不能把所有 0 到 5 公里都當成錯誤,最好回頭看原始欄位定義。我自己踩過的坑是只清了空值,忘了 0,圖還是錯的,白跑一輪。
你們手上的目錄,深度未知是用空值、0,還是別的特殊代碼?
0
赞同度 100% · 0 条评论 · 2 阅读
0 条评论
还没有评论,写下第一条。