mcpField
O
obspy

obspy

github.com/steadfastasartData & databases7365 installsUpdated 6w ago
Repository

About obspy

ObsPy is a Python toolkit for seismology data processing, aimed at researchers and practitioners working with seismic waveforms and earthquake data. It combines waveform handling, FDSN data access, and seismology-specific processing.

Key features

  1. 01Read and write seismic formats
  2. 02Fetch waveforms and station metadata via FDSN
  3. 03Search earthquake catalogs
  4. 04Filter, trim, and merge traces
  5. 05Remove instrument response

Use cases

  1. 01Fetch and process earthquake waveforms
  2. 02Inspect station and channel metadata
  3. 03Prepare seismic traces for analysis

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill obspy

After installing, type/obspyin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
channel_codes.md
fdsn_clients.md
troubleshooting.md
scripts/
batch_process.py
fetch_earthquake.py

Details

From the project README

ObsPy - Seismology Data Processing

Quick Reference

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

ClassPurpose
StreamContainer for multiple Trace objects
TraceSingle waveform with data + metadata
UTCDateTimePrecise time handling
InventoryStation/channel metadata
CatalogEarthquake event information

Essential Operations

Read and Inspect
st = read("data.mseed")              # Auto-detect format
tr = st[0]
print(tr.stats.station, tr.stats.channel, tr.stats.sampling_rate)
Filter and Process
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
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
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
inv = client.get_stations(
    network="IU", station="ANMO",
    level="response"                 # Required for response removal
)
Remove Instrument Response
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
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
st.print_gaps()                      # Check for gaps
st.merge(method=1, fill_value="interpolate")

Writing Data

st.write("output.mseed", format="MSEED")
st.write("output.sac", format="SAC")

Error Handling

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

  1. Always detrend and taper before filtering to avoid artifacts
  2. Use level="response" when fetching stations for instrument correction
  3. Check for gaps before processing with st.print_gaps()
  4. Wildcards work in queries: station="A*", channel="BH?"
  5. UTCDateTime accepts ISO strings, timestamps, datetime objects

When to Use vs Alternatives

ToolBest For
obspyFull seismology workflows, FDSN data access, waveform processing
segyioFast, low-level SEG-Y file I/O for reflection seismic data
scipy.signalGeneric signal processing without seismology-specific features

Use obspy when you need seismological context: FDSN clients, instrument response removal, earthquake catalogs, or standard seismic formats.

Use segyio instead when working exclusively with SEG-Y files for reflection seismic. segyio is faster for large 3D volumes with inline/crossline access.

Use scipy.signal instead when you only need generic filtering or spectral analysis and don't need seismology-specific metadata or data access.

Common Workflows

Fetch and process earthquake waveforms
- [ ] Initialize FDSN client: `Client("IRIS")`
- [ ] Search events with `client.get_events()` for target magnitude/region
- [ ] Fetch waveforms with `client.get_waveforms()` for desired stations
- [ ] Get station metadata with `level="response"` for instrument correction
- [ ] Preprocess: detrend, taper, remove instrument response
- [ ] Filter to frequency band of interest
- [ ] Trim to analysis window and export or plot

References

Scripts

Comments

Markdown supported