ObsPy - Seismology Data Processing
Quick Reference
python
from obspy import read, UTCDateTime
from obspy.clients.fdsn import Client
# Read local file (MiniSEED, SAC, etc.)
st = read("data.mseed")
tr = st[0] # First trace
print(tr.stats) # Metadata
# Fetch from FDSN
client = Client("IRIS")
t = UTCDateTime("2023-02-06T01:17:00")
st = client.get_waveforms("IU", "ANMO", "00", "LHZ", t, t + 3600)
st.plot()
Key Classes
| Class | Purpose |
|---|---|
Stream | Container for multiple Trace objects |
Trace | Single waveform with data + metadata |
UTCDateTime | Precise time handling |
Inventory | Station/channel metadata |
Catalog | Earthquake event information |
Essential Operations
Read and Inspect
python
st = read("data.mseed") # Auto-detect format
tr = st[0]
print(tr.stats.station, tr.stats.channel, tr.stats.sampling_rate)
Filter and Process
python
st.detrend("demean") # Remove mean
st.detrend("linear") # Remove trend
st.taper(max_percentage=0.05) # Taper edges
st.filter("bandpass", freqmin=0.1, freqmax=10.0)
Fetch Waveforms from FDSN
python
client = Client("IRIS")
t1 = UTCDateTime("2023-02-06T01:17:00")
st = client.get_waveforms("IU", "ANMO", "00", "LHZ", t1, t1 + 3600)
st.write("output.mseed", format="MSEED")
Search Earthquakes
python
client = Client("USGS")
cat = client.get_events(
starttime=UTCDateTime("2023-01-01"),
endtime=UTCDateTime("2023-12-31"),
minmagnitude=7.0
)
event = cat[0]
print(f"M{event.magnitudes[0].mag} at {event.origins[0].latitude}")
Get Station Metadata
python
inv = client.get_stations(
network="IU", station="ANMO",
level="response" # Required for response removal
)
Remove Instrument Response
python
st = client.get_waveforms("IU", "ANMO", "00", "LHZ", t, t + 3600)
inv = client.get_stations(network="IU", station="ANMO", level="response")
st.remove_response(inventory=inv, output="VEL") # VEL, DISP, or ACC
Trim and Select
python
st.trim(UTCDateTime("2023-01-01"), UTCDateTime("2023-01-01T01:00:00"))
st_z = st.select(channel="*Z") # Vertical only
st_bh = st.select(channel="BH*") # BH channels
Merge and Handle Gaps
python
st.print_gaps() # Check for gaps st.merge(method=1, fill_value="interpolate")
Writing Data
python
st.write("output.mseed", format="MSEED")
st.write("output.sac", format="SAC")
Error Handling
python
from obspy.clients.fdsn.header import FDSNNoDataException
try:
st = client.get_waveforms("IU", "ANMO", "00", "LHZ", t1, t2)
except FDSNNoDataException:
print("No data available")
Common Tips
- •Always detrend and taper before filtering to avoid artifacts
- •Use
level="response"when fetching stations for instrument correction - •Check for gaps before processing with
st.print_gaps() - •Wildcards work in queries:
station="A*",channel="BH?" - •UTCDateTime accepts ISO strings, timestamps, datetime objects
References
- •FDSN Data Centers - Available data centers and capabilities
- •Channel Codes - Channel naming convention details
- •Troubleshooting - Common issues and solutions
Scripts
- •scripts/fetch_earthquake.py - Fetch waveforms for an earthquake
- •scripts/batch_process.py - Batch process seismic files