ObsPy for Python Seismology Workflows
ObsPy: A Python Toolbox for seismology/seismological observatories.
At a glance
- What is it?
- ObsPy is a Python framework for reading seismological data, accessing data centers, and processing waveform time series. It suits seismologists, observatories, and Python developers who need a shared workflow, while installation depends on Python 3.12 or later and the project wiki.
- Who is it for?
- ObsPy is appropriate for Python developers who need a common workflow for reading, querying, and processing seismological time series, especially in observatory and data-center software. It is less suitable for users who need a self-contained command-line application or who cannot follow the wiki-based installation process.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 9 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
ObsPy's role in seismic data processing
ObsPy addresses a specific integration problem in seismology. Waveform data may arrive in common file formats or through data-center services, while analysis requires consistent Python operations. The project supplies parsers for common file formats, clients for accessing data centers, and signal-processing routines for manipulating seismological time series. This makes it relevant to observatories, research groups, data centers, and developers building seismological applications.
The README identifies rapid application development as a project goal. That is a narrower and more useful claim than describing ObsPy as a general scientific package. Its documented scope covers reading, data access, processing, and visualization. The opening example performs a representative local workflow: load an example seismogram, apply a high-pass filter, keep one component, and display the result.
ObsPy also serves as a seismology-facing layer within Python. The project description does not establish that it replaces general numerical or plotting libraries. Instead, the README presents ObsPy as a bridge between seismological workflows and the scientific Python ecosystem. That architecture favors reuse when a laboratory already handles metadata, numerical computation, reporting, and plots in Python.
Reading, filtering, and selecting waveform data
The documented workflow begins with `read()` and stores the returned object in `st`. It then modifies or narrows that object through method calls. This sequence exposes a consistent object-oriented interface instead of requiring a separate procedure for each step.
from obspy import read
st = read() # load example seismogram
st.filter(type='highpass', freq=3.0)
st = st.select(component='Z')
st.plot()The first call loads the bundled example seismogram. The filter call requests a high-pass operation with `freq=3.0`, after which selection limits the data to the `Z` component. The final call creates a plot. The example does not define a frequency-response correction, trigger detector, event association routine, or instrument-state model, so those capabilities should not be inferred from this short demonstration.
ObsPy's broader description says it can obtain data through data-center clients. The README does not list those clients or document their authentication options, retry policy, transfer controls, or availability guarantees. The README also does not show a remote-client example. Developers evaluating ObsPy for an operational acquisition service need more evidence than the local waveform example provides.
Python 3.12 installation requirements
The README does not place an installation command in the installation section. Instead, it directs users to the installation section of the GitHub wiki. The repository exposes PyPI and Conda references, but the README does not document an exact package installation command. Inventing one would go beyond the documented setup.
One concrete requirement appears in `setup.py`: `MIN_PYTHON_VERSION` is set to `(3, 12)`. The file prints an error when `sys.version_info` is below that minimum. Therefore, a new environment must use Python 3.12 or later before attempting an ObsPy installation through the documented distribution channels.
MIN_PYTHON_VERSION = (3, 12)That is the minimum version declared by the repository, not a promise that every dependency or platform combination works. The README points to supported-version and dependency information elsewhere, while `pyproject.toml` declares `setuptools` as its build-system requirement. It does not specify a complete installation environment or a universal operating-system matrix.
A practical first setup therefore begins with the wiki, not the README installation paragraph. Confirm the supported Python version, choose the distribution route documented there, and then run the README's waveform example in the same environment.
Checking ObsPy's format and data-center scope
Format support is central to ObsPy's value, but the README does not enumerate the supported formats. It establishes that parsers exist for common seismological files. That wording is insufficient to conclude that an acquisition system, instrument vendor, or archival repository will work without conversion or adaptation.
The same boundary applies to data-center access. Clients exist according to the project description, but the README does not name each client or explain how requests map to ObsPy objects. It also says nothing about rate limits, service outages, incomplete channels, latency, caching, or bulk-transfer behavior. An observatory should check those details against the actual service it uses before committing to an implementation.
This is not a defect in the processing example. It is a boundary between library functionality and deployment requirements. Local waveform processing can be evaluated with the short example, while production data acquisition requires provider-specific verification. Projects needing a single converter command should look for a dedicated conversion tool if ObsPy's parser coverage does not include their format.
Release cadence, maintenance, and LGPL licensing
The repository is not archived. Its last push was on 2026-10-14. Recent releases include 1.5.1 on 2026-08-28, 1.5.0 on 2026-03-13, and 1.4.2 on 2025-04-30. Those dates indicate recent project activity and versioned releases. They do not by themselves guarantee compatibility with every existing dependency or data-center service.
Upgrade planning should include `CHANGELOG.txt`, because the README identifies it as the detailed changelog. Migration steps, deprecations, and upgrade costs must be checked for the specific target versions rather than inferred from the release list.
The README and `setup.py` identify GNU Lesser General Public License v3.0, and the README shows an LGPLv3 reference. The repository metadata classifies the license as custom and points to `LICENSE.txt`. Users need to examine that file for the exact terms applying to their distribution model. No legal conclusion can be drawn from the shorter README statement alone. Linking, modification, packaging, and redistribution can carry different obligations, so the project-specific license text matters.
ObsPy versus a format-specific converter
A dedicated format converter is a real alternative when the task ends after translating one file into another. Such a tool can expose a narrow command-line interface and avoid embedding a Python runtime in the processing system. ObsPy takes a broader approach: it combines parsing, data-center clients, waveform processing, selection, and plotting within a Python framework.
That broader scope is an advantage for applications that continue to analyze data after reading it. It is unnecessary overhead for a simple batch conversion that has no downstream seismological processing. ObsPy is also the wrong fit for a non-Python deployment that cannot host Python 3.12 or later, unless the application can call a separate service or wrapper around it.
The repository includes `runtests.py`, a `debian/` directory, packaging files, and contribution documentation. Those entries show more than source modules, but the README does not document a stable command-line interface for general conversion. The documented first use is a Python API call, so teams should compare ObsPy against their actual pipeline rather than assume it is a replacement for every converter or observatory processing package.
Editorial conclusion
ObsPy is appropriate for Python developers who need a common workflow for reading, querying, and processing seismological time series, especially in observatory and data-center software. It is less suitable for users who need a self-contained command-line application or who cannot follow the wiki-based installation process. Verify Python 3.12 compatibility, coverage for every required file format and data-center client, and the implications of LGPL v3.0 before adoption. For a first evaluation, confirm that the documented `read()` example loads its example seismogram and that the plotting environment works.
Frequently asked questions
How do I install ObsPy?
The README directs users to the installation section of the ObsPy GitHub wiki. It does not include an installation command, although it links to PyPI and Conda.
What is the minimum Python version required by ObsPy?
The repository's `setup.py` sets `MIN_PYTHON_VERSION` to `(3, 12)`, so the declared minimum is Python 3.12.
How do I load, filter, and plot an ObsPy example seismogram?
The README uses `read()` to load an example seismogram, applies a 3.0 Hz high-pass filter, selects the `Z` component, and calls `plot()`.
Can ObsPy access data directly from a data center?
The project description says ObsPy includes clients for accessing data centers. The README does not identify individual clients or document provider-specific request behavior.
What license applies to ObsPy?
The README and `setup.py` identify GNU Lesser General Public License v3.0. The repository metadata points to `LICENSE.txt` as the authoritative project license file because it classifies the license as custom.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/obspy-obspy)Was this useful?