Reading, Modifying, and Converting Seismic Event Data Using ObsPy

Yasmine ACHEMINE
6 min readOct 13, 2023

--

![ObsPy Logo](obspy_logo_full_highres.png)
*ObsPy logo. Image source: [ObsPy Logo Source](https://raw.githubusercontent.com/obspy/website/master/logo/obspy_logo_full_highres.png)*

Seismic data analysis is a fundamental aspect of seismology and earthquake research. To delve into the world of seismic data, you need the right tools, and ObsPy is one such powerful tool that simplifies the process.

In this comprehensive tutorial, we will explore how to read seismic event data using ObsPy, convert data from Counts to the physical unit, and change essential channel information.

Whether you’re a beginner or a seasoned seismologist, this tutorial will provide insights into the nuances of working with ObsPy.

What is Obspy?

From the Obspy web page, we can read:

ObsPy is an open-source project dedicated to provide a Python framework for processing seismological data. It provides parsers for common file formats, clients to access data centers and seismological signal processing routines which allow the manipulation of seismological time seriesPrerequisites

ObsPy is an open-source Python library designed for seismology and seismological signal processing. It provides a comprehensive toolbox for working with seismological data, making it a valuable resource for researchers and professionals in the field of seismology. Some of the core features and functionalities of the ObsPy library include:

  1. Data Retrieval: ObsPy allows users to access and retrieve seismic data from various seismological data centers and sources, including web services, in a standardized format.
  2. Data Processing: The library provides a wide range of tools and functions for processing and analyzing seismic data, including filtering, instrument response correction, and spectral analysis.
  3. Data Visualization: ObsPy includes modules for creating various types of plots and visualizations to help users better understand and interpret seismological data.
  4. Instrument Response: It offers utilities for handling instrument response, which is crucial for converting recorded data into meaningful physical units.
  5. Event Detection and Analysis: ObsPy can be used to detect and analyze seismic events, such as earthquakes, and provides tools for locating their epicenters and determining their magnitudes.
  6. Support for Standard Data Formats: The library supports standard seismic data formats, such as MiniSEED and SEIS-AN, which are widely used in the seismological community.

Prerequisites

Before we get started, make sure you have Python and ObsPy installed. If you haven’t already, you can install Obspy using pip:

pip install obspy

Or if you use conda:

conda install -c conda-forge obspy

The Code

Reading Data

As mentioned before, Obspy offers the possibility of manipulating data in various formats; you can find these listed at this link. In this article, we will be exploring the usage of the Kinemetrics EVT file format.

  • Our journey begins by importing the read method from the ObsPy library. This method is a powerful tool for reading and handling seismic data. It equips us with the ability to parse various data formats, making it a versatile choice for seismic data analysis. We import it with the following line of code:
from obspy import read, write
  • The next essential step is to specify the file name. In this code, we store the file path in a variable named event_name , this variable holds the path to the seismic event data file we want to work with. It's important to ensure that this path is accurate and points to the correct file location.
event_name = "/Users/user/Desktop/Obspy/Data/Event_name.evt"
  • With the read method and the event_name variable in place, we proceed to read the seismic event data. The read method takes many arguments only one of them is necessary which is the pathname_or_url. In our code, we are telling ObsPy to read the data from the file specified in event_name using the "kinemetrics_evt" format. The detrend() method applied to the returned object st is used to remove any trends from the data, enhancing its suitability for analysis. It’s important to note that while we explicitly specify the format in this example, ObsPy is adept at automatically recognizing many common formats, which makes it even more user-friendly.
st = read(pathname_or_url=event_name, format="kinemetrics_evt").detrend()
  • In the next section, we loop through the traces in the st object, which represents the seismic data. For each trace (tr), we print its details, including the channel's status. This helps us get a better understanding and a visual of the data we are working with.
for tr in st:
print("\n", tr)
print(f"Status of the channel {tr.stats.channel}:\n", tr.stats)

Below is a snippet of part of the output that we get:

Modifying the data

After checking the headers of the EVT file we may find that we want to add some pieces of information that are missing or modify them or both.

As observed with the EVT format some of the contents of thetr.stats variable will be missing, also if you are in the habit of giving a specific name to each channel while configuring the sensor you’ll find that these names are not taken into consideration in the tr.stats.channel variable.

Fear not because in this section, we will work on fixing these issues.

for tr in st:
tr.stats.network = "..." # Replace ...
tr.stats.station = tr.stats.kinemetrics_evt.stnid
tr.stats.location = "..." # Replace ...
tr.stats.channel = tr.stats.kinemetrics_evt.chan_id

# Converting the data from Counts to physical unit
tr.data = tr.data * tr.stats.calib

print("\n", tr)
print(f"Status of the channel {tr.stats.channel}:\n", tr.stats)
  • As done before, we iterate through each tr and modify the tr.stats variables: network, location, station, and channel. We retrieve these last two from the tr.stats.kinemetrics_evt (see bellow picture) attribute if they are not already assigned whereas for the other ones, unfortunately, we must add them manually hence the “…” placeholder.
  • Furthermore, we convert the data from Counts to the physical unit by multiplying it by the calibration factor (calib). Finally, we print the modified trace and its status as done previously.

Saving the Modifications

We will finalize by saving the update into a new EVT file. This is fairly easy and can be done with only two or one line of code if you’re wiled at heat.

  • First, we specify the output_file variable to define the path where you want to save the modified event file. You can choose any valid path and filename you prefer.
  • Then, we use the write() method that we imported before on our stream object (st) with the specified output_file and format "kinemetrics_evt" to write the modifications back to the EVT file. This will save the seismic data with our changes to the new file specified in output_file.
# Specify the output file path and name
output_file = "/Users/user/Desktop/Obspy/Data/modified_event.evt"

st.write(output_file, format="kinemetrics_evt")

Running the Code

To run this code, you’ll need to replace event_name with the path to your own event file. Once executed, you'll have converted seismic data and updated channel information.

Conclusion

Putting it all together, ObsPy is a fantastic tool for anyone working with seismic data. It simplifies the process of reading, processing, and analyzing data, making it an essential tool for seismologists and researchers alike.

With the knowledge gained from this tutorial, you’re well on your way to mastering the art of seismic data manipulation using ObsPy.

Happy seismology!

References

Beyreuther, M., Barsch, R., Krischer, L., Megies, T., Behr, Y., & Wassermann, J. (2010). ObsPy: A Python toolbox for seismology. Seismological Research Letters, 81(3), 530–533. Retrieved from [ObsPy Project](https://docs.obspy.org)

--

--

Yasmine ACHEMINE

Automation Engineer at a research center, passionate about seismology, data accessibility, and programming, advancing earthquake research. 🌍🔬💻