1 Membaca Data¶
obspy
dapat membaca berbagai jenis format data ataupun metadata, untuk membaca data kita dapat menggunakan fungsi read
:
from obspy import read
st=read('/content/drive/MyDrive/BMKG_Akselerometer/event-sundastrait-20210321/ASJR_E.mseed')
print(st)
1 Trace(s) in Stream: IA.ASJR.00.HNE | 2021-03-21T05:56:43.000000Z - 2021-03-21T06:31:43.000000Z | 100.0 Hz, 210001 samples
Data rekaman yang dibaca obspy
akan disimpan dalam bentuk objek Stream
di memori, struktur objek ini adalah seperti pada gambar di bawah ini:
Pada contoh di atas tertulis bahwa terdapat 1 Trace
dalam Stream
, Trace
merupakan objek data 1 komponen sedangkan Stream
merupakan object data 1 stasiun sehingga 1 Stream
bisa terdiri atas banyak Trace
. Data yang sudah terbaca terdiri atas 1 komponen saja. Kita dapat mengeplot data menggunakan:
st.plot()
Dalam object Stream
informasi mengenai parameter rekaman seperti sampling_rate
dan yang lain tersimpan dalam masing-masing Trace
. Trace
dapat diambil dengan menggunakan indeks:
tr1 = st[0] #index 0 untuk Trace pertama
tr1.plot()
Informasi parameter perekaman dapat diakses menggunakan Trace.stats
:
tr1.stats
network: IA station: ASJR location: 00 channel: HNE starttime: 2021-03-21T05:56:43.000000Z endtime: 2021-03-21T06:31:43.000000Z sampling_rate: 100.0 delta: 0.01 npts: 210001 calib: 1.0 _format: MSEED mseed: AttribDict({'dataquality': 'R', 'number_of_records': 517, 'encoding': 'STEIM1', 'byteorder': '>', 'record_length': 512, 'filesize': 264704})
2 Menggabungkan Data¶
Data dalam setiap komponen E, N, dan Z dapat digabungkan dalam 1 Stream
sehingga nantinya 1 Stream
terdiri atas 3 Trace
:
st=read('/content/drive/MyDrive/BMKG_Akselerometer/event-sundastrait-20210321/ASJR_Z.mseed')
st+=read('/content/drive/MyDrive/BMKG_Akselerometer/event-sundastrait-20210321/ASJR_N.mseed')
st+=read('/content/drive/MyDrive/BMKG_Akselerometer/event-sundastrait-20210321/ASJR_E.mseed')
print(st)
3 Trace(s) in Stream: IA.ASJR.00.HNZ | 2021-03-21T05:56:43.000000Z - 2021-03-21T06:31:43.000000Z | 100.0 Hz, 210001 samples IA.ASJR.00.HNN | 2021-03-21T05:56:43.000000Z - 2021-03-21T06:31:43.000000Z | 100.0 Hz, 210001 samples IA.ASJR.00.HNE | 2021-03-21T05:56:43.000000Z - 2021-03-21T06:31:43.000000Z | 100.0 Hz, 210001 samples
Dari hasil menjalankan perintah di atas kita mendapatkan 1 Stream
dengan 3 komponen (Trace
).
st.plot()
seperti contoh sebelumnya, kita juga dapat mengakses Trace
tertentu menggunakan indeks, contoh apabila ingin mengakses Trace
kedua (indeks 1 karena mulai dari 0)
tr2 = st[0]
print(tr2.stats)
network: IA station: ASJR location: 00 channel: HNZ starttime: 2021-03-21T05:56:43.000000Z endtime: 2021-03-21T06:31:43.000000Z sampling_rate: 100.0 delta: 0.01 npts: 210001 calib: 1.0 _format: MSEED mseed: AttribDict({'dataquality': 'R', 'number_of_records': 515, 'encoding': 'STEIM1', 'byteorder': '>', 'record_length': 512, 'filesize': 263680})
Jika informasi parameter rekaman dapat diambil dari Trace.stats
maka informasi yang berisi data rekaman dapat diakses dengan Trace.data
:
tr2.data
array([ 3, 12, 0, ..., 0, 13, 3], dtype=int32)
Sehingga bisa kita plot data dengan cara yang lain misalkan dengan bantuan matplotlib
:
import matplotlib.pyplot as plt
data = tr2.data
waktu = tr2.times()
plt.plot(waktu, data)
[<matplotlib.lines.Line2D at 0x7f2f6f6b01d0>]
3 Melakukan pengolahan sinyal sederhana¶
obspy
sudah melengkapi Stream
dengan berbagai fungsi untuk memodifikasi data, kita dapat melihat fungsi (method
) apa saja yang didukung oleh obspy
dalam Stream
dengan:
from obspy import read
st = read()
st.filter("highpass",freq=1.0)
st.plot()
help(st)
Help on Stream in module obspy.core.stream object: class Stream(builtins.object) | Stream(traces=None) | | List like object of multiple ObsPy :class:`~obspy.core.trace.Trace` | objects. | | :type traces: list of :class:`~obspy.core.trace.Trace`, optional | :param traces: Initial list of ObsPy :class:`~obspy.core.trace.Trace` | objects. | | .. rubric:: Basic Usage | | >>> trace1 = Trace() | >>> trace2 = Trace() | >>> stream = Stream(traces=[trace1, trace2]) | >>> print(stream) # doctest: +ELLIPSIS | 2 Trace(s) in Stream: | ... | | .. rubric:: Supported Operations | | ``stream = streamA + streamB`` | Merges all traces within the two Stream objects ``streamA`` and | ``streamB`` into the new Stream object ``stream``. | See also: :meth:`Stream.__add__`. | ``stream += streamA`` | Extends the Stream object ``stream`` with all traces from ``streamA``. | See also: :meth:`Stream.__iadd__`. | ``len(stream)`` | Returns the number of Traces in the Stream object ``stream``. | See also: :meth:`Stream.__len__`. | ``str(stream)`` | Contains the number of traces in the Stream object and returns the | value of each Trace's __str__ method. | See also: :meth:`Stream.__str__`. | | Methods defined here: | | __add__(self, other) | Add two streams or a stream with a single trace. | | :type other: :class:`~obspy.core.stream.Stream` or | :class:`~obspy.core.trace.Trace` | :param other: Stream or Trace object to add. | :rtype: :class:`~obspy.core.stream.Stream` | :returns: New Stream object containing references to the traces of the | original streams | | .. rubric:: Examples | | 1. Adding two Streams | | >>> st1 = Stream([Trace(), Trace(), Trace()]) | >>> len(st1) | 3 | >>> st2 = Stream([Trace(), Trace()]) | >>> len(st2) | 2 | >>> stream = st1 + st2 | >>> len(stream) | 5 | | 2. Adding Stream and Trace | | >>> stream2 = st1 + Trace() | >>> len(stream2) | 4 | | __delitem__(self, index) | Passes on the __delitem__ method to the underlying list of traces. | | __eq__(self, other) | Implements rich comparison of Stream objects for "==" operator. | | Trace order does not effect the comparison because the traces are | sorted beforehand. | | This function strictly compares the data and stats objects of each | trace contained by the streams. If less strict behavior is desired, | which may be the case for testing, consider using the | :func:`~obspy.core.util.testing.streams_almost_equal` function. | | :type other: :class:`~obspy.core.stream.Stream` | :param other: Stream object for comparison. | :rtype: bool | :return: ``True`` if both Streams contain the same traces, i.e. after a | sort operation going through both streams every trace should be | equal according to Trace's | :meth:`~obspy.core.trace.Trace.__eq__` operator. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> st2 = st.copy() | >>> st is st2 | False | >>> st == st2 | True | | __ge__(self, other) | Too ambiguous, throw an Error. | | __getitem__(self, index) | __getitem__ method of obspy.Stream objects. | | :return: Trace objects | | __getslice__(self, i, j, k=1) | __getslice__ method of obspy.Stream objects. | | :return: Stream object | | __gt__(self, other) | Too ambiguous, throw an Error. | | __iadd__(self, other) | Add two streams with self += other. | | It will extend the current Stream object with the traces of the given | Stream. Traces will not be copied but references to the original traces | will be appended. | | :type other: :class:`~obspy.core.stream.Stream` or | :class:`~obspy.core.trace.Trace` | :param other: Stream or Trace object to add. | | .. rubric:: Example | | >>> stream = Stream([Trace(), Trace(), Trace()]) | >>> len(stream) | 3 | | >>> stream += Stream([Trace(), Trace()]) | >>> len(stream) | 5 | | >>> stream += Trace() | >>> len(stream) | 6 | | __init__(self, traces=None) | Initialize self. See help(type(self)) for accurate signature. | | __iter__(self) | Return a robust iterator for stream.traces. | | Doing this it is safe to remove traces from streams inside of | for-loops using stream's :meth:`~obspy.core.stream.Stream.remove` | method. Actually this creates a new iterator every time a trace is | removed inside the for-loop. | | .. rubric:: Example | | >>> from obspy import Stream | >>> st = Stream() | >>> for component in ["1", "Z", "2", "3", "Z", "N", "E", "4", "5"]: | ... channel = "EH" + component | ... tr = Trace(header={'station': 'TEST', 'channel': channel}) | ... st.append(tr) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 9 Trace(s) in Stream: | .TEST..EH1 | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EHZ | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EH2 | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EH3 | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EHZ | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EHN | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EHE | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EH4 | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EH5 | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | | >>> for tr in st: | ... if tr.stats.channel[-1] not in ["Z", "N", "E"]: | ... st.remove(tr) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 4 Trace(s) in Stream: | .TEST..EHZ | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EHZ | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EHN | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | .TEST..EHE | 1970-01-01T00:00:00.000000Z - ... | 1.0 Hz, 0 samples | | __le__(self, other) | Too ambiguous, throw an Error. | | __len__(self) | Return the number of Traces in the Stream object. | | .. rubric:: Example | | >>> stream = Stream([Trace(), Trace(), Trace()]) | >>> len(stream) | 3 | | __lt__(self, other) | Too ambiguous, throw an Error. | | __mul__(self, num) | Create a new Stream containing num copies of this stream. | | :rtype num: int | :param num: Number of copies. | :returns: New ObsPy Stream object. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> len(st) | 3 | >>> st2 = st * 5 | >>> len(st2) | 15 | | __ne__(self, other) | Implements rich comparison of Stream objects for "!=" operator. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> st2 = st.copy() | >>> st is st2 | False | >>> st != st2 | False | | __nonzero__(self) | A Stream is considered zero if has no Traces. | | __setitem__(self, index, trace) | __setitem__ method of obspy.Stream objects. | | __str__(self, extended=False) | Return short summary string of the current stream. | | It will contain the number of Traces in the Stream and the return value | of each Trace's :meth:`~obspy.core.trace.Trace.__str__` method. | | :type extended: bool, optional | :param extended: This method will show only 20 traces by default. | Enable this option to show all entries. | | .. rubric:: Example | | >>> stream = Stream([Trace(), Trace()]) | >>> print(stream) # doctest: +ELLIPSIS | 2 Trace(s) in Stream: | ... | | append(self, trace) | Append a single Trace object to the current Stream object. | | :param trace: :class:`~obspy.core.trace.Trace` object. | | .. rubric:: Example | | >>> from obspy import read, Trace | >>> st = read() | >>> tr = Trace() | >>> tr.stats.station = 'TEST' | >>> st.append(tr) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 4 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | .TEST.. | 1970-01-01T00:00:00.000000Z ... | 1.0 Hz, 0 samples | | attach_response(self, inventories) | Search for and attach channel response to each trace as | trace.stats.response. Does not raise an exception but shows a warning | if response information can not be found for all traces. Returns a | list of traces for which no response could be found. | To subsequently deconvolve the instrument response use | :meth:`Stream.remove_response`. | | >>> from obspy import read, read_inventory | >>> st = read() | >>> inv = read_inventory() | >>> st.attach_response(inv) | [] | >>> tr = st[0] | >>> print(tr.stats.response) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE | Channel Response | From M/S (Velocity in Meters per Second) to COUNTS (Digital Counts) | Overall Sensitivity: 2.5168e+09 defined at 0.020 Hz | 4 stages: | Stage 1: PolesZerosResponseStage from M/S to V, gain: 1500 | Stage 2: CoefficientsTypeResponseStage from V to COUNTS, ... | Stage 3: FIRResponseStage from COUNTS to COUNTS, gain: 1 | Stage 4: FIRResponseStage from COUNTS to COUNTS, gain: 1 | | :type inventories: :class:`~obspy.core.inventory.inventory.Inventory` | or :class:`~obspy.core.inventory.network.Network` or a list | containing objects of these types. | :param inventories: Station metadata to use in search for response for | each trace in the stream. | :rtype: list of :class:`~obspy.core.trace.Trace` | :returns: list of traces for which no response information could be | found. | | clear(self) | Clear trace list (convenience method). | | Replaces Stream's trace list by an empty one creating an empty | Stream object. Useful if there are references to the current | Stream object that should not break. Otherwise simply use a new | Stream() instance. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> len(st) | 3 | >>> st.clear() # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.traces | [] | | copy(self) | Return a deepcopy of the Stream object. | | :rtype: :class:`~obspy.core.stream.Stream` | :return: Copy of current stream. | | .. rubric:: Examples | | 1. Create a Stream and copy it | | >>> from obspy import read | >>> st = read() | >>> st2 = st.copy() | | The two objects are not the same: | | >>> st is st2 | False | | But they have equal data (before applying further processing): | | >>> st == st2 | True | | 2. The following example shows how to make an alias but not copy the | data. Any changes on ``st3`` would also change the contents of | ``st``. | | >>> st3 = st | >>> st is st3 | True | >>> st == st3 | True | | count = __len__(self) | | cutout(self, starttime, endtime) | Cut the given time range out of all traces of this Stream object. | | :type starttime: :class:`~obspy.core.utcdatetime.UTCDateTime` | :param starttime: Start of time span to remove from stream. | :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime` | :param endtime: End of time span to remove from stream. | | .. rubric:: Example | | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> t1 = UTCDateTime("2009-08-24T00:20:06") | >>> t2 = UTCDateTime("2009-08-24T00:20:11") | >>> st.cutout(t1, t2) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 6 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 301 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 301 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 301 samples | BW.RJOB..EHZ | 2009-08-24T00:20:11.000000Z ... | 100.0 Hz, 2200 samples | BW.RJOB..EHN | 2009-08-24T00:20:11.000000Z ... | 100.0 Hz, 2200 samples | BW.RJOB..EHE | 2009-08-24T00:20:11.000000Z ... | 100.0 Hz, 2200 samples | | decimate(self, factor, no_filter=False, strict_length=False) | Downsample data in all traces of stream by an integer factor. | | :type factor: int | :param factor: Factor by which the sampling rate is lowered by | decimation. | :type no_filter: bool, optional | :param no_filter: Deactivates automatic filtering if set to ``True``. | Defaults to ``False``. | :type strict_length: bool, optional | :param strict_length: Leave traces unchanged for which end time of | trace would change. Defaults to ``False``. | | Currently a simple integer decimation is implemented. | Only every decimation_factor-th sample remains in the trace, all other | samples are thrown away. Prior to decimation a lowpass filter is | applied to ensure no aliasing artifacts are introduced. The automatic | filtering can be deactivated with ``no_filter=True``. | | If the length of the data array modulo ``decimation_factor`` is not | zero then the end time of the trace is changing on sub-sample scale. To | abort downsampling in case of changing end times set | ``strict_length=True``. | | .. note:: | | The :class:`~Stream` object has three different methods to change | the sampling rate of its data: :meth:`~.resample`, | :meth:`~.decimate`, and :meth:`~.interpolate` | | Make sure to choose the most appropriate one for the problem at | hand. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | .. rubric:: Example | | For the example we switch off the automatic pre-filtering so that | the effect of the downsampling routine becomes clearer. | | >>> from obspy import Trace, Stream | >>> tr = Trace(data=np.arange(10)) | >>> st = Stream(traces=[tr]) | >>> tr.stats.sampling_rate | 1.0 | >>> tr.data | array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) | >>> st.decimate(4, strict_length=False, no_filter=True) | ... # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> tr.stats.sampling_rate | 0.25 | >>> tr.data | array([0, 4, 8]) | | detrend(self, type='simple', **options) | Remove a trend from all traces. | | For details on supported methods and parameters see the corresponding | :meth:`~obspy.core.trace.Trace.detrend` method of | :class:`~obspy.core.trace.Trace`. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data will no longer be accessible afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | | differentiate(self, method='gradient') | Differentiate all traces with respect to time. | | :type method: str, optional | :param method: Method to use for differentiation. Defaults to | ``'gradient'``. See the `Supported Methods`_ section below for | further details. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | .. rubric:: _`Supported Methods` | | ``'gradient'`` | The gradient is computed using central differences in the interior | and first differences at the boundaries. The returned gradient | hence has the same shape as the input array. (uses | :func:`numpy.gradient`) | | extend(self, trace_list) | Extend the current Stream object with a list of Trace objects. | | :param trace_list: list of :class:`~obspy.core.trace.Trace` objects or | :class:`~obspy.core.stream.Stream`. | | .. rubric:: Example | | >>> from obspy import read, Trace | >>> st = read() | >>> tr1 = Trace() | >>> tr1.stats.station = 'TEST1' | >>> tr2 = Trace() | >>> tr2.stats.station = 'TEST2' | >>> st.extend([tr1, tr2]) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 5 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | .TEST1.. | 1970-01-01T00:00:00.000000Z ... | 1.0 Hz, 0 samples | .TEST2.. | 1970-01-01T00:00:00.000000Z ... | 1.0 Hz, 0 samples | | filter(self, type, **options) | Filter the data of all traces in the Stream. | | :type type: str | :param type: String that specifies which filter is applied (e.g. | ``"bandpass"``). See the `Supported Filter`_ section below for | further details. | :param options: Necessary keyword arguments for the respective filter | that will be passed on. (e.g. ``freqmin=1.0``, ``freqmax=20.0`` for | ``"bandpass"``) | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | .. rubric:: _`Supported Filter` | | ``'bandpass'`` | Butterworth-Bandpass (uses :func:`obspy.signal.filter.bandpass`). | | ``'bandstop'`` | Butterworth-Bandstop (uses :func:`obspy.signal.filter.bandstop`). | | ``'lowpass'`` | Butterworth-Lowpass (uses :func:`obspy.signal.filter.lowpass`). | | ``'highpass'`` | Butterworth-Highpass (uses :func:`obspy.signal.filter.highpass`). | | ``'lowpass_cheby_2'`` | Cheby2-Lowpass (uses :func:`obspy.signal.filter.lowpass_cheby_2`). | | ``'lowpass_fir'`` (experimental) | FIR-Lowpass (uses :func:`obspy.signal.filter.lowpass_fir`). | | ``'remez_fir'`` (experimental) | Minimax optimal bandpass using Remez algorithm (uses | :func:`obspy.signal.filter.remez_fir`). | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> st.filter("highpass", freq=1.0) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.plot() # doctest: +SKIP | | .. plot:: | | from obspy import read | st = read() | st.filter("highpass", freq=1.0) | st.plot() | | get_gaps(self, min_gap=None, max_gap=None) | Determine all trace gaps/overlaps of the Stream object. | | :param min_gap: All gaps smaller than this value will be omitted. The | value is assumed to be in seconds. Defaults to None. | :param max_gap: All gaps larger than this value will be omitted. The | value is assumed to be in seconds. Defaults to None. | | The returned list contains one item in the following form for each gap/ | overlap: [network, station, location, channel, starttime of the gap, | end time of the gap, duration of the gap, number of missing samples] | | Please be aware that no sorting and checking of stations, channels, ... | is done. This method only compares the start and end times of the | Traces and the start and end times of segments within Traces that | contain masked arrays (i.e., Traces that were merged without a fill | value). | | .. rubric:: Example | | Our example stream has no gaps: | | >>> from obspy import read, UTCDateTime | >>> st = read() | >>> st.get_gaps() | [] | >>> st.print_gaps() # doctest: +ELLIPSIS | Source Last Sample ... | Total: 0 gap(s) and 0 overlap(s) | | So let's make a copy of the first trace and cut both so that we end up | with a gappy stream: | | >>> tr = st[0].copy() | >>> t = UTCDateTime("2009-08-24T00:20:13.0") | >>> st[0].trim(endtime=t) # doctest: +ELLIPSIS | <...Trace object at 0x...> | >>> tr.trim(starttime=t + 1) # doctest: +ELLIPSIS | <...Trace object at 0x...> | >>> st.append(tr) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.get_gaps()[0] # doctest: +SKIP | [['BW', 'RJOB', '', 'EHZ', UTCDateTime(2009, 8, 24, 0, 20, 13), | UTCDateTime(2009, 8, 24, 0, 20, 14), 1.0, 99]] | >>> st.print_gaps() # doctest: +ELLIPSIS | Source Last Sample ... | BW.RJOB..EHZ 2009-08-24T00:20:13.000000Z ... | Total: 1 gap(s) and 0 overlap(s) | | insert(self, position, object) | Insert either a single Trace or a list of Traces before index. | | :param position: The Trace will be inserted at position. | :param object: Single Trace object or list of Trace objects. | | integrate(self, method='cumtrapz', **options) | Integrate all traces with respect to time. | | For details see the corresponding | :meth:`~obspy.core.trace.Trace.integrate` method of | :class:`~obspy.core.trace.Trace`. | | :type method: str, optional | :param type: Method to use for integration. Defaults to | ``'cumtrapz'``. See :meth:`~obspy.core.trace.Trace.integrate` for | further details. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | interpolate(self, *args, **kwargs) | Interpolate all Traces in a Stream. | | For details see the corresponding | :meth:`~obspy.core.trace.Trace.interpolate` method of | :class:`~obspy.core.trace.Trace`. | | .. note:: | | The :class:`~Stream` object has three different methods to change | the sampling rate of its data: :meth:`~.resample`, | :meth:`~.decimate`, and :meth:`~.interpolate` | | Make sure to choose the most appropriate one for the problem at | hand. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data will no longer be accessible afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | | >>> from obspy import read | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03... - ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03... - ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03... - ... | 100.0 Hz, 3000 samples | >>> st.interpolate(sampling_rate=111.1) # doctest: +ELLIPSIS | <obspy.core.stream.Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03... - ... | 111.1 Hz, 3332 samples | BW.RJOB..EHN | 2009-08-24T00:20:03... - ... | 111.1 Hz, 3332 samples | BW.RJOB..EHE | 2009-08-24T00:20:03... - ... | 111.1 Hz, 3332 samples | | max(self) | Get the values of the absolute maximum amplitudes of all traces in the | stream. See :meth:`~obspy.core.trace.Trace.max`. | | :return: List of values of absolute maxima of all traces | | .. rubric:: Example | | >>> from obspy import Trace, Stream | >>> tr1 = Trace(data=np.array([0, -3, 9, 6, 4])) | >>> tr2 = Trace(data=np.array([0, -3, -9, 6, 4])) | >>> tr3 = Trace(data=np.array([0.3, -3.5, 9.0, 6.4, 4.3])) | >>> st = Stream(traces=[tr1, tr2, tr3]) | >>> st.max() | [9, -9, 9.0] | | merge(self, method=0, fill_value=None, interpolation_samples=0, **kwargs) | Merge ObsPy Trace objects with same IDs. | | :type method: int, optional | :param method: Methodology to handle overlaps/gaps of traces. Defaults | to ``0``. | See :meth:`obspy.core.trace.Trace.__add__` for details on | methods ``0`` and ``1``, | see :meth:`obspy.core.stream.Stream._cleanup` for details on | method ``-1``. Any merge operation performs a cleanup merge as | a first step (method ``-1``). | :type fill_value: int, float, str or ``None``, optional | :param fill_value: Fill value for gaps. Defaults to ``None``. Traces | will be converted to NumPy masked arrays if no value is given and | gaps are present. The value ``'latest'`` will use the latest value | before the gap. If value ``'interpolate'`` is provided, missing | values are linearly interpolated (not changing the data | type e.g. of integer valued traces). Not used for ``method=-1``. | :type interpolation_samples: int, optional | :param interpolation_samples: Used only for ``method=1``. It specifies | the number of samples which are used to interpolate between | overlapping traces. Default to ``0``. If set to ``-1`` all | overlapping samples are interpolated. | | Importing waveform data containing gaps or overlaps results into | a :class:`~obspy.core.stream.Stream` object with multiple traces having | the same identifier. This method tries to merge such traces inplace, | thus returning nothing. Merged trace data will be converted into a | NumPy :class:`~numpy.ma.MaskedArray` type if any gaps are present. This | behavior may be prevented by setting the ``fill_value`` parameter. | The ``method`` argument controls the handling of overlapping data | values. | | normalize(self, global_max=False) | Normalize all Traces in the Stream. | | By default all traces are normalized separately to their respective | absolute maximum. By setting ``global_max=True`` all traces get | normalized to the global maximum of all traces. | | :param global_max: If set to ``True``, all traces are normalized with | respect to the global maximum of all traces in the stream | instead of normalizing every trace separately. | | .. note:: | If ``data.dtype`` of a trace was integer it is changing to float. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | .. rubric:: Example | | Make a Stream with two Traces: | | >>> from obspy import Trace, Stream | >>> tr1 = Trace(data=np.array([0, -3, 9, 6, 4])) | >>> tr2 = Trace(data=np.array([0.3, -0.5, -0.8, 0.4, 0.3])) | >>> st = Stream(traces=[tr1, tr2]) | | All traces are normalized to their absolute maximum and processing | information is added: | | >>> st.normalize() # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st[0].data # doctest: +ELLIPSIS | array([ 0. , -0.33333333, 1. , 0.66666667, ...]) | >>> print(st[0].stats.processing[0]) # doctest: +ELLIPSIS | ObsPy ... normalize(norm=None) | >>> st[1].data | array([ 0.375, -0.625, -1. , 0.5 , 0.375]) | >>> print(st[1].stats.processing[0]) # doctest: +ELLIPSIS | ObsPy ...: normalize(norm=None) | | Now let's do it again normalize all traces to the stream's global | maximum: | | >>> tr1 = Trace(data=np.array([0, -3, 9, 6, 4])) | >>> tr2 = Trace(data=np.array([0.3, -0.5, -0.8, 0.4, 0.3])) | >>> st = Stream(traces=[tr1, tr2]) | | >>> st.normalize(global_max=True) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st[0].data # doctest: +ELLIPSIS | array([ 0. , -0.33333333, 1. , 0.66666667, ...]) | >>> print(st[0].stats.processing[0]) # doctest: +ELLIPSIS | ObsPy ...: normalize(norm=9) | >>> st[1].data # doctest: +ELLIPSIS | array([ 0.03333333, -0.05555556, -0.08888889, 0.04444444, ...]) | >>> print(st[1].stats.processing[0]) # doctest: +ELLIPSIS | ObsPy ...: normalize(norm=9) | | plot(self, *args, **kwargs) | Create a waveform plot of the current ObsPy Stream object. | | :param outfile: Output file string. Also used to automatically | determine the output format. Supported file formats depend on your | matplotlib backend. Most backends support png, pdf, ps, eps and | svg. Defaults to ``None``. | :param format: Format of the graph picture. If no format is given the | outfile parameter will be used to try to automatically determine | the output format. If no format is found it defaults to png output. | If no outfile is specified but a format is, than a binary | imagestring will be returned. | Defaults to ``None``. | :param starttime: Start time of the graph as a | :class:`~obspy.core.utcdatetime.UTCDateTime` object. If not set | the graph will be plotted from the beginning. | Defaults to ``None``. | :param endtime: End time of the graph as a | :class:`~obspy.core.utcdatetime.UTCDateTime` object. If not set | the graph will be plotted until the end. | Defaults to ``None``. | :param fig: Use an existing matplotlib figure instance. | Defaults to ``None``. | :param automerge: If automerge is True, Traces with the same id will be | merged. | Defaults to ``True``. | :param size: Size tuple in pixel for the output file. This corresponds | to the resolution of the graph for vector formats. | Defaults to ``(800, 250)`` pixel per channel for ``type='normal'`` | or ``type='relative'``, ``(800, 600)`` for ``type='dayplot'``, and | ``(1000, 600)`` for ``type='section'``. | :param dpi: Dots per inch of the output file. This also affects the | size of most elements in the graph (text, linewidth, ...). | Defaults to ``100``. | :param color: Color of the graph as a matplotlib color string as | described below. If ``type='dayplot'`` a list/tuple of color | strings is expected that will be periodically repeated for each | line plotted. If ``type='section'`` then the values ``'network'``, | ``'station'`` or ``'channel'`` are also accepted, and traces will | be uniquely colored by the given information. | Defaults to ``'black'`` or to ``('#B2000F', '#004C12', '#847200', | '#0E01FF')`` for ``type='dayplot'``. | :param bgcolor: Background color of the graph. | Defaults to ``'white'``. | :param face_color: Face color of the matplotlib canvas. | Defaults to ``'white'``. | :param transparent: Make all backgrounds transparent (True/False). This | will override the ``bgcolor`` and ``face_color`` arguments. | Defaults to ``False``. | :param tick_format: The way the time axis is formatted. | Defaults to ``'%H:%M:%S'`` or ``'%.2f'`` if ``type='relative'``. | :param tick_rotation: Tick rotation in degrees. | Defaults to ``0``. | :param handle: Whether or not to return the matplotlib figure instance | after the plot has been created. | Defaults to ``False``. | :param method: By default, all traces with more than 400,000 samples | will be plotted with a fast method that cannot be zoomed. | Setting this argument to ``'full'`` will straight up plot the data. | This results in a potentially worse performance but the interactive | matplotlib view can be used properly. | Defaults to 'fast'. | :param type: Type may be set to either: ``'normal'`` to produce the | standard plot; ``'dayplot'`` to create a one-day plot for a single | Trace; ``'relative'`` to convert all date/time information to a | relative scale starting the seismogram at 0 seconds; ``'section'`` | to plot all seismograms in a single coordinate system shifted | according to their distance from a reference point. Defaults to | ``'normal'``. | :param equal_scale: If enabled all plots are equally scaled. | Defaults to ``True``. | :param show: If True, show the plot interactively after plotting. This | is ignored if any of ``outfile``, ``format``, ``handle``, or | ``fig`` are specified. | Defaults to ``True``. | :param draw: If True, the figure canvas is explicitly re-drawn, which | ensures that *existing* figures are fresh. It makes no difference | for figures that are not yet visible. | Defaults to ``True``. | :param block: If True block call to showing plot. Only works if the | active matplotlib backend supports it. | Defaults to ``True``. | :param linewidth: Float value in points of the line width. | Defaults to ``1.0``. | :param linestyle: Line style. | Defaults to ``'-'`` | :param grid_color: Color of the grid. | Defaults to ``'black'``. | :param grid_linewidth: Float value in points of the grid line width. | Defaults to ``0.5``. | :param grid_linestyle: Grid line style. | Defaults to ``':'`` | | **Dayplot Parameters** | | The following parameters are only available if ``type='dayplot'`` is | set. | | :param vertical_scaling_range: Determines how each line is scaled in | its given space. Every line will be centered around its mean value | and then clamped to fit its given space. This argument is the range | in data units that will be used to clamp the data. If the range is | smaller than the actual range, the lines' data may overshoot to | other lines which is usually a desired effect. Larger ranges will | result in a vertical padding. | If ``0``, the actual range of the data will be used and no | overshooting or additional padding will occur. | If ``None`` the range will be chosen to be the 99.5-percentile of | the actual range - so some values will overshoot. | Defaults to ``None``. | :param interval: This defines the interval length in minutes for one | line. | Defaults to ``15``. | :param time_offset: Only used if ``type='dayplot'``. The difference | between the timezone of the data (specified with the kwarg | ``timezone``) and UTC time in hours. Will be displayed in a string. | Defaults to the current offset of the system time to UTC time. | :param timezone: Defines the name of the user defined time scale. Will | be displayed in a string together with the actual offset defined in | the kwarg ``time_offset``. | Defaults to ``'local time'``. | :param localization_dict: Enables limited localization of the dayplot | through the usage of a dictionary. To change the labels to, e.g. | German, use the following:: | | localization_dict={'time in': 'Zeit in', 'seconds': 'Sekunden', | 'minutes': 'Minuten', 'hours': 'Stunden'} | | :param data_unit: If given, the scale of the data will be drawn on the | right hand side in the form ``"%f {data_unit}"``. The unit is | supposed to be a string containing the actual unit of the data. Can | be a LaTeX expression if matplotlib has been built with LaTeX | support, e.g., ``"$\\frac{m}{s}$"``. Be careful to escape the | backslashes, or use r-prefixed strings, e.g., | ``r"$\\frac{m}{s}$"``. | Defaults to ``None``, meaning no scale is drawn. | :param number_of_ticks: The number of ticks on the x-axis. | Defaults to ``4``. | :param events: An optional list of events can be drawn on the plot if | given. They will be displayed as yellow stars with optional | annotations. They are given as a list of dictionaries. Each | dictionary at least needs to have a "time" key, containing a | UTCDateTime object with the origin time of the event. Furthermore | every event can have an optional "text" key which will then be | displayed as an annotation. | Example:: | | events=[{"time": UTCDateTime(...), "text": "Event A"}, {...}] | | It can also be a :class:`~obspy.core.event.Catalog` object. In this | case each event will be annotated with its corresponding | Flinn-Engdahl region and the magnitude. | Events can also be automatically downloaded with the help of | obspy.clients.fdsn. Just pass a dictionary with a "min_magnitude" | key, e.g. :: | | events={"min_magnitude": 5.5} | | Defaults to ``[]``. | :param x_labels_size: Size of x labels in points or fontsize. | Defaults to ``8``. | :param y_labels_size: Size of y labels in points or fontsize. | Defaults to ``8``. | :param title_size: Size of the title in points or fontsize. | Defaults to ``10``. | :param subplots_adjust_left: The left side of the subplots of the | figure in fraction of the figure width. | Defaults to ``0.12``. | :param subplots_adjust_right: The right side of the subplots of the | figure in fraction of the figure width. | Defaults to ``0.88``. | :param subplots_adjust_top: The top side of the subplots of the figure | in fraction of the figure width. | Defaults to ``0.95``. | :param subplots_adjust_bottom: The bottom side of the subplots of the | figure in fraction of the figure width. | Defaults to ``0.1``. | :param right_vertical_labels: Whether or not to display labels on the | right side of the dayplot. | Defaults to ``False``. | :param one_tick_per_line: Whether or not to display one tick per line. | Defaults to ``False``. | :param show_y_UTC_label: Whether or not to display the Y UTC vertical | label. | Defaults to ``True``. | :param title: The title to display on top of the plot. | Defaults to ``self.stream[0].id``. | | **Section Parameters** | | These parameters are only available if ``type='section'`` is set. To | plot a record section the ObsPy header ``trace.stats.distance`` must be | defined in meters (Default). Or ``trace.stats.coordinates.latitude`` & | ``trace.stats.coordinates.longitude`` must be set if plotted in | azimuthal distances (``dist_degree=True``) along with ``ev_coord``. | | :type scale: float, optional | :param scale: Scale the traces width with this factor. | Defaults to ``1.0``. | :type vred: float, optional | :param vred: Perform velocity reduction, in m/s. | :type norm_method: str, optional | :param norm_method: Defines how the traces are normalized, either | against each ``trace`` or against the global maximum ``stream``. | Defaults to ``trace``. | :type offset_min: float or None, optional | :param offset_min: Minimum offset in meters to plot. | Defaults to minimum offset of all traces. | :type offset_max: float or None, optional | :param offset_max: Maximum offset in meters to plot. | Defaults to maximum offset of all traces. | :type dist_degree: bool, optional | :param dist_degree: Plot trace distance in degree from epicenter. If | ``True``, parameter ``ev_coord`` has to be defined. | Defaults to ``False``. | :type ev_coord: tuple or None, optional | :param ev_coord: Event's coordinates as tuple | ``(latitude, longitude)``. | :type plot_dx: int, optional | :param plot_dx: Spacing of ticks on the spatial x-axis. | Either m or degree, depending on ``dist_degree``. | :type recordstart: int or float, optional | :param recordstart: Seconds to crop from the beginning. | :type recordlength: int or float, optional | :param recordlength: Length of the record section in seconds. | :type alpha: float, optional | :param alpha: Transparency of the traces between 0.0 - 1.0. | Defaults to ``0.5``. | :type time_down: bool, optional | :param time_down: Flip the plot horizontally, time goes down. | Defaults to ``False``, i.e., time goes up. | :type reftime: :class:`~obspy.core.utcdatetime.UTCDateTime`, optional | :param reftime: The reference time to which the time scale will refer. | Defaults to the minimum start time of the visible traces. | :type orientation: str, optional | :param orientation: The orientation of the time axis, either | ``'vertical'`` or ``'horizontal'``. Defaults to ``'vertical'``. | :type fillcolors: tuple, optional | :param fillcolors: Fill the inside of the lines (wiggle plot), | for both the positive and negative sides; use ``None`` to omit | one of the sides. Defaults to ``(None,None)``. | | **Relative Parameters** | | The following parameters are only available if ``type='relative'`` is | set. | | :type reftime: :class:`~obspy.core.utcdatetime.UTCDateTime`, optional | :param reftime: The reference time to which the relative scale will | refer. | Defaults to ``starttime``. | | .. rubric:: Color Options | | Colors can be specified as defined in the :mod:`matplotlib.colors` | documentation. | | Short Version: For all color values, you can either use: | | * legal `HTML color names <https://www.w3.org/TR/css3-color/#html4>`_, | e.g. ``'blue'``, | * HTML hex strings, e.g. ``'#EE00FF'``, | * pass an string of a R, G, B tuple, where each of the components is a | float value in the range of 0 to 1, e.g. ``'(1, 0.25, 0.5)'``, or | * use single letters for the basic built-in colors, such as ``'b'`` | (blue), ``'g'`` (green), ``'r'`` (red), ``'c'`` (cyan), ``'m'`` | (magenta), ``'y'`` (yellow), ``'k'`` (black), ``'w'`` (white). | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> st.plot() # doctest: +SKIP | | .. plot:: | | from obspy import read | st = read() | st.plot() | | pop(self, index=-1) | Remove and return the Trace object specified by index from the Stream. | | If no index is given, remove the last Trace. Passes on the pop() to | self.traces. | | :param index: Index of the Trace object to be returned and removed. | :returns: Removed Trace. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> tr = st.pop() | >>> print(st) # doctest: +ELLIPSIS | 2 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> print(tr) # doctest: +ELLIPSIS | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | print_gaps(self, min_gap=None, max_gap=None) | Print gap/overlap list summary information of the Stream object. | | :param min_gap: All gaps smaller than this value will be omitted. The | value is assumed to be in seconds. Defaults to None. | :param max_gap: All gaps larger than this value will be omitted. The | value is assumed to be in seconds. Defaults to None. | | .. rubric:: Example | | Our example stream has no gaps: | | >>> from obspy import read, UTCDateTime | >>> st = read() | >>> st.get_gaps() | [] | >>> st.print_gaps() # doctest: +ELLIPSIS | Source Last Sample Next Sample ... | Total: 0 gap(s) and 0 overlap(s) | | So let's make a copy of the first trace and cut both so that we end up | with a gappy stream: | | >>> tr = st[0].copy() | >>> t = UTCDateTime("2009-08-24T00:20:13.0") | >>> st[0].trim(endtime=t) # doctest: +ELLIPSIS | <...Trace object at 0x...> | >>> tr.trim(starttime=t+1) # doctest: +ELLIPSIS | <...Trace object at 0x...> | >>> st.append(tr) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.get_gaps() # doctest: +ELLIPSIS | [[..., UTCDateTime(2009, 8, 24, 0, 20, 13), ... | >>> st.print_gaps() # doctest: +ELLIPSIS | Source Last Sample ... | BW.RJOB..EHZ 2009-08-24T00:20:13.000000Z ... | Total: 1 gap(s) and 0 overlap(s) | | | And finally let us create some overlapping traces: | | >>> st = read() | >>> tr = st[0].copy() | >>> t = UTCDateTime("2009-08-24T00:20:13.0") | >>> st[0].trim(endtime=t) # doctest: +ELLIPSIS | <...Trace object at 0x...> | >>> tr.trim(starttime=t-1) # doctest: +ELLIPSIS | <...Trace object at 0x...> | >>> st.append(tr) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.get_gaps() # doctest: +ELLIPSIS | [[...'EHZ', UTCDateTime(2009, 8, 24, 0, 20, 13), ... | >>> st.print_gaps() # doctest: +ELLIPSIS | Source Last Sample ... | BW.RJOB..EHZ 2009-08-24T00:20:13.000000Z ... | Total: 0 gap(s) and 1 overlap(s) | | remove(self, trace) | Remove the first occurrence of the specified Trace object in the | Stream object. Passes on the remove() call to self.traces. | | :param trace: Trace object to be removed from Stream. | | .. rubric:: Example | | This example shows how to delete all "E" component traces in a stream: | | >>> from obspy import read | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> for tr in st.select(component="E"): | ... st.remove(tr) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 2 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | remove_response(self, *args, **kwargs) | Deconvolve instrument response for all Traces in Stream. | | For details see the corresponding | :meth:`~obspy.core.trace.Trace.remove_response` method of | :class:`~obspy.core.trace.Trace`. | | >>> from obspy import read, read_inventory | >>> st = read() | >>> inv = read_inventory() | >>> st.remove_response(inventory=inv) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.plot() # doctest: +SKIP | | .. plot:: | | from obspy import read, read_inventory | st = read() | inv = read_inventory() | st.remove_response(inventory=inv) | st.plot() | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | | remove_sensitivity(self, *args, **kwargs) | Remove instrument sensitivity for all Traces in Stream. | | For details see the corresponding | :meth:`~obspy.core.trace.Trace.remove_sensitivity` method of | :class:`~obspy.core.trace.Trace`. | | >>> from obspy import read, read_inventory | >>> st = read() | >>> inv = read_inventory() | >>> st.remove_sensitivity(inv) # doctest: +ELLIPSIS | <...Stream object at 0x...> | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | | resample(self, sampling_rate, window='hanning', no_filter=True, strict_length=False) | Resample data in all traces of stream using Fourier method. | | :type sampling_rate: float | :param sampling_rate: The sampling rate of the resampled signal. | :type window: :class:`numpy.ndarray`, callable, str, float, or tuple, | optional | :param window: Specifies the window applied to the signal in the | Fourier domain. Defaults ``'hanning'`` window. See | :func:`scipy.signal.resample` for details. | :type no_filter: bool, optional | :param no_filter: Deactivates automatic filtering if set to ``True``. | Defaults to ``True``. | :type strict_length: bool, optional | :param strict_length: Leave traces unchanged for which end time of | trace would change. Defaults to ``False``. | | .. note:: | | The :class:`~Stream` object has three different methods to change | the sampling rate of its data: :meth:`~.resample`, | :meth:`~.decimate`, and :meth:`~.interpolate` | | Make sure to choose the most appropriate one for the problem at | hand. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | Uses :func:`scipy.signal.resample`. Because a Fourier method is used, | the signal is assumed to be periodic. | | .. rubric:: Example | | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> st.resample(10.0) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 10.0 Hz, 300 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 10.0 Hz, 300 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 10.0 Hz, 300 samples | | reverse(self) | Reverse the Traces of the Stream object in place. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> st.reverse() # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | rotate(self, method, back_azimuth=None, inclination=None, inventory=None, **kwargs) | Rotate stream objects. | | :type method: str | :param method: Determines the rotation method. | | ``'->ZNE'``: Rotates data from three components into Z, North- and | East-components based on the station metadata (e.g. borehole | stations). Uses mandatory ``inventory`` parameter (provide | either an :class:`~obspy.core.inventory.inventory.Inventory` or | :class:`~obspy.io.xseed.parser.Parser` object) and ignores | ``back_azimuth`` and ``inclination`` parameters. Additional | kwargs will be passed on to :meth:`_rotate_to_zne()` (use if | other components than ``["Z", "1", "2"]`` and | ``["1", "2", "3"]`` need to be rotated). | Trims common channels used in rotation to time spans that are | available for all three channels (i.e. cuts away parts for | which one or two channels used in rotation do not have data). | ``'NE->RT'``: Rotates the North- and East-components of a | seismogram to radial and transverse components. | ``'RT->NE'``: Rotates the radial and transverse components of a | seismogram to North- and East-components. | ``'ZNE->LQT'``: Rotates from left-handed Z, North, and East system | to LQT, e.g. right-handed ray coordinate system. | ``'LQT->ZNE'``: Rotates from LQT, e.g. right-handed ray coordinate | system to left handed Z, North, and East system. | | :type back_azimuth: float, optional | :param back_azimuth: Depends on the chosen method. | A single float, the back azimuth from station to source in degrees. | If not given, ``stats.back_azimuth`` will be used. It will also be | written after the rotation is done. | :type inclination: float, optional | :param inclination: Inclination of the ray at the station in degrees. | Only necessary for three component rotations. If not given, | ``stats.inclination`` will be used. It will also be written after | the rotation is done. | :type inventory: :class:`~obspy.core.inventory.inventory.Inventory` or | :class:`~obspy.io.xseed.parser.Parser` | :param inventory: Inventory or SEED Parser with metadata of channels. | | Example to rotate unaligned borehole instrument data based on station | inventory (a dataless SEED :class:`~obspy.io.xseed.parser.Parser` can | also be provided, see details for option ``inventory``): | | >>> from obspy import read, read_inventory | >>> st = read("/path/to/ffbx_unrotated_gaps.mseed") | >>> inv = read_inventory("/path/to/ffbx.stationxml") | >>> st.rotate(method="->ZNE", inventory=inv) # doctest: +ELLIPSIS | <obspy.core.stream.Stream object at 0x...> | | select(self, network=None, station=None, location=None, channel=None, sampling_rate=None, npts=None, component=None, id=None, inventory=None) | Return new Stream object only with these traces that match the given | stats criteria (e.g. all traces with ``channel="EHZ"``). | | Alternatively, traces can be selected based on the content of an | :class:`~obspy.core.inventory.inventory.Inventory` object: trace will | be selected if the inventory contains a matching channel active at the | trace start time. | | .. rubric:: Examples | | >>> from obspy import read | >>> st = read() | >>> st2 = st.select(station="R*") | >>> print(st2) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | >>> st2 = st.select(id="BW.RJOB..EHZ") | >>> print(st2) # doctest: +ELLIPSIS | 1 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | >>> st2 = st.select(component="Z") | >>> print(st2) # doctest: +ELLIPSIS | 1 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | >>> st2 = st.select(network="CZ") | >>> print(st2) # doctest: +NORMALIZE_WHITESPACE | 0 Trace(s) in Stream: | | >>> from obspy import read_inventory | >>> inv = read_inventory('/path/to/BW_RJOB__EHZ.xml') | >>> print(inv) # doctest: +NORMALIZE_WHITESPACE | Inventory created at 2013-12-07T18:00:42.878000Z | Created by: fdsn-stationxml-converter/1.0.0 | http://www.iris.edu/fdsnstationconverter | Sending institution: Erdbebendienst Bayern | Contains: | Networks (1): | BW | Stations (1): | BW.RJOB (Jochberg, Bavaria, BW-Net) | Channels (1): | BW.RJOB..EHZ | >>> st2 = st.select(inventory=inv) | >>> print(st2) # doctest: +ELLIPSIS | 1 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | .. warning:: | A new Stream object is returned but the traces it contains are | just aliases to the traces of the original stream. Does not copy | the data but only passes a reference. | | All keyword arguments except for ``component`` are tested directly | against the respective entry in the :class:`~obspy.core.trace.Stats` | dictionary. | | If a string for ``component`` is given (should be a single letter) it | is tested against the last letter of the ``Trace.stats.channel`` entry. | | Alternatively, ``channel`` may have the last one or two letters | wildcarded (e.g. ``channel="EH*"``) to select all components with a | common band/instrument code. | | All other selection criteria that accept strings (network, station, | location) may also contain Unix style wildcards (``*``, ``?``, ...). | | simulate(self, paz_remove=None, paz_simulate=None, remove_sensitivity=True, simulate_sensitivity=True, **kwargs) | Correct for instrument response / Simulate new instrument response. | | :type paz_remove: dict, None | :param paz_remove: Dictionary containing keys ``'poles'``, ``'zeros'``, | ``'gain'`` (A0 normalization factor). Poles and zeros must be a | list of complex floating point numbers, gain must be of type float. | Poles and Zeros are assumed to correct to m/s, SEED convention. | Use ``None`` for no inverse filtering. | Use ``'self'`` to use paz AttribDict in ``trace.stats`` for every | trace in stream. | :type paz_simulate: dict, None | :param paz_simulate: Dictionary containing keys ``'poles'``, | ``'zeros'``, ``'gain'``. Poles and zeros must be a list of complex | floating point numbers, gain must be of type float. Or ``None`` for | no simulation. | :type remove_sensitivity: bool | :param remove_sensitivity: Determines if data is divided by | ``paz_remove['sensitivity']`` to correct for overall sensitivity of | recording instrument (seismometer/digitizer) during instrument | correction. | :type simulate_sensitivity: bool | :param simulate_sensitivity: Determines if data is multiplied with | ``paz_simulate['sensitivity']`` to simulate overall sensitivity of | new instrument (seismometer/digitizer) during instrument | simulation. | | This function corrects for the original instrument response given by | ``paz_remove`` and/or simulates a new instrument response given by | ``paz_simulate``. | | For additional information and more options to control the instrument | correction/simulation (e.g. water level, demeaning, tapering, ...) see | :func:`~obspy.signal.invsim.simulate_seismometer`. | | The keywords `paz_remove` and `paz_simulate` are expected to be | dictionaries containing information on poles, zeros and gain (and | usually also sensitivity). | | If both ``paz_remove`` and ``paz_simulate`` are specified, both steps | are performed in one go in the frequency domain, otherwise only the | specified step is performed. | | .. note:: | | Instead of the builtin deconvolution based on Poles and Zeros | information, the deconvolution can be performed using evalresp | instead by using the option `seedresp` (see documentation of | :func:`~obspy.signal.invsim.simulate_seismometer` and the | `ObsPy Tutorial | <https://docs.obspy.org/master/tutorial/code_snippets/seismometer_correction_simulation.html#using-a-resp-file>`_. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | .. rubric:: Example | | >>> from obspy import read | >>> from obspy.signal.invsim import corn_freq_2_paz | >>> st = read() | >>> paz_sts2 = {'poles': [-0.037004+0.037016j, -0.037004-0.037016j, | ... -251.33+0j, | ... -131.04-467.29j, -131.04+467.29j], | ... 'zeros': [0j, 0j], | ... 'gain': 60077000.0, | ... 'sensitivity': 2516778400.0} | >>> paz_1hz = corn_freq_2_paz(1.0, damp=0.707) | >>> st.simulate(paz_remove=paz_sts2, paz_simulate=paz_1hz) | ... # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.plot() # doctest: +SKIP | | .. plot:: | | from obspy import read | from obspy.signal.invsim import corn_freq_2_paz | st = read() | paz_sts2 = {'poles': [-0.037004+0.037016j, -0.037004-0.037016j, | -251.33+0j, | -131.04-467.29j, -131.04+467.29j], | 'zeros': [0j, 0j], | 'gain': 60077000.0, | 'sensitivity': 2516778400.0} | paz_1hz = corn_freq_2_paz(1.0, damp=0.707) | paz_1hz['sensitivity'] = 1.0 | st.simulate(paz_remove=paz_sts2, paz_simulate=paz_1hz) | st.plot() | | slice(self, starttime=None, endtime=None, keep_empty_traces=False, nearest_sample=True) | Return new Stream object cut to the given start and end time. | | :type starttime: :class:`~obspy.core.utcdatetime.UTCDateTime` | :param starttime: Specify the start time of all traces. | :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime` | :param endtime: Specify the end time of all traces. | :type keep_empty_traces: bool, optional | :param keep_empty_traces: Empty traces will be kept if set to ``True``. | Defaults to ``False``. | :type nearest_sample: bool, optional | :param nearest_sample: If set to ``True``, the closest sample is | selected, if set to ``False``, the inner (next sample for a | start time border, previous sample for an end time border) sample | containing the time is selected. Defaults to ``True``. | | Given the following trace containing 6 samples, "|" are the | sample points, "A" is the requested starttime:: | | | |A | | B | | | 1 2 3 4 5 6 | | ``nearest_sample=True`` will select samples 2-5, | ``nearest_sample=False`` will select samples 3-4 only. | | :return: :class:`~obspy.core.stream.Stream` | | .. note:: | | The basic idea of :meth:`~obspy.core.stream.Stream.slice` | is to avoid copying the sample data in memory. So sample data in | the resulting :class:`~obspy.core.stream.Stream` object contains | only a reference to the original traces. | | .. rubric:: Example | | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> dt = UTCDateTime("2009-08-24T00:20:20") | >>> st = st.slice(dt, dt + 5) | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples | BW.RJOB..EHN | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples | BW.RJOB..EHE | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples | | slide(self, window_length, step, offset=0, include_partial_windows=False, nearest_sample=True) | Generator yielding equal length sliding windows of the Stream. | | Please keep in mind that it only returns a new view of the original | data. Any modifications are applied to the original data as well. If | you don't want this you have to create a copy of the yielded | windows. Also be aware that if you modify the original data and you | have overlapping windows, all following windows are affected as well. | | Not all yielded windows must have the same number of traces. The | algorithm will determine the maximal temporal extents by analysing | all Traces and then creates windows based on these times. | | .. rubric:: Example | | >>> import obspy | >>> st = obspy.read() | >>> for windowed_st in st.slide(window_length=10.0, step=10.0): | ... print(windowed_st) | ... print("---") # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS | 3 Trace(s) in Stream: | ... | 2009-08-24T00:20:03.000000Z - 2009-08-24T00:20:13.000000Z | ... | ... | 2009-08-24T00:20:03.000000Z - 2009-08-24T00:20:13.000000Z | ... | ... | 2009-08-24T00:20:03.000000Z - 2009-08-24T00:20:13.000000Z | ... | --- | 3 Trace(s) in Stream: | ... | 2009-08-24T00:20:13.000000Z - 2009-08-24T00:20:23.000000Z | ... | ... | 2009-08-24T00:20:13.000000Z - 2009-08-24T00:20:23.000000Z | ... | ... | 2009-08-24T00:20:13.000000Z - 2009-08-24T00:20:23.000000Z | ... | | | :param window_length: The length of each window in seconds. | :type window_length: float | :param step: The step between the start times of two successive | windows in seconds. Can be negative if an offset is given. | :type step: float | :param offset: The offset of the first window in seconds relative to | the start time of the whole interval. | :type offset: float | :param include_partial_windows: Determines if windows that are | shorter then 99.9 % of the desired length are returned. | :type include_partial_windows: bool | :param nearest_sample: If set to ``True``, the closest sample is | selected, if set to ``False``, the inner (next sample for a | start time border, previous sample for an end time border) sample | containing the time is selected. Defaults to ``True``. | | Given the following trace containing 6 samples, "|" are the | sample points, "A" is the requested starttime:: | | | |A | | B | | | 1 2 3 4 5 6 | | ``nearest_sample=True`` will select samples 2-5, | ``nearest_sample=False`` will select samples 3-4 only. | :type nearest_sample: bool, optional | | sort(self, keys=['network', 'station', 'location', 'channel', 'starttime', 'endtime'], reverse=False) | Sort the traces in the Stream object. | | The traces will be sorted according to the keys list. It will be sorted | by the first item first, then by the second and so on. It will always | be sorted from low to high and from A to Z. | | :type keys: list, optional | :param keys: List containing the values according to which the traces | will be sorted. They will be sorted by the first item first and | then by the second item and so on. | Always available items: 'network', 'station', 'channel', | 'location', 'starttime', 'endtime', 'sampling_rate', 'npts', | 'dataquality' | Defaults to ['network', 'station', 'location', 'channel', | 'starttime', 'endtime']. | :type reverse: bool | :param reverse: Reverts sorting order to descending. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> st.sort() # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | | spectrogram(self, **kwargs) | Create a spectrogram plot for each trace in the stream. | | For details on kwargs that can be used to customize the spectrogram | plot see :func:`obspy.imaging.spectrogram.spectrogram`. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> st[0].spectrogram() # doctest: +SKIP | | .. plot:: | | from obspy import read | st = read() | st[0].spectrogram() | | split(self) | Split any trace containing gaps into contiguous unmasked traces. | | :rtype: :class:`obspy.core.stream.Stream` | :returns: Returns a new stream object containing only contiguous | unmasked. | | stack(self, group_by='all', stack_type='linear', npts_tol=0, time_tol=0) | Stack traces by the same selected metadata. | | The metadata of each trace (including starttime) corresponds to the | metadata of the original traces if those are the same. | Additionaly, the entry ``stack`` is written to the stats object(s). | It contains the fields ``group`` | (result of the format operation on the ``group_by`` parameter), | ``count`` (number of stacked traces) and ``type`` | (``stack_type`` argument). | | :type group_by: str | :param group_by: Stack waveforms together which have the same metadata | given by this parameter. The parameter should name the | corresponding keys of the stats object, | e.g. ``'{network}.{station}'`` for stacking all | locations and channels of the stations and returning a stream | consisting of one stacked trace for each station. | This parameter can take two special values, | ``'id'`` which stacks the waveforms by SEED id and | ``'all'`` (default) which stacks together all traces in the stream. | :type stack_type: str or tuple | :param stack_type: Type of stack, one of the following: | ``'linear'``: average stack (default), | ``('pw', order)``: phase weighted stack of given order | (see [Schimmel1997]_, order 0 corresponds to linear stack), | ``('root', order)``: root stack of given order | (order 1 corresponds to linear stack). | :type npts_tol: int | :param npts_tol: Tolerate traces with different number of points | with a difference up to this value. Surplus samples are discarded. | :type time_tol: float | :param time_tol: Tolerate difference, in seconds, in startime when | setting the new starttime of the stack. If starttimes differs more | than this value it will be set to timestamp 0. | | >>> from obspy import read | >>> st = read() | >>> stack = st.stack() | >>> print(stack) # doctest: +ELLIPSIS | 1 Trace(s) in Stream: | BW.RJOB.. | 2009-08-24T00:20:03.000000Z - ... | 100.0 Hz, 3000 samples | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data will no longer be accessible afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | | std(self) | Calculate standard deviations of all Traces in the Stream. | | Standard deviations are calculated by NumPy method | :meth:`~numpy.ndarray.std` on ``trace.data`` for every trace in the | stream. | | :return: List of standard deviations of all traces. | | .. rubric:: Example | | >>> from obspy import Trace, Stream | >>> tr1 = Trace(data=np.array([0, -3, 9, 6, 4])) | >>> tr2 = Trace(data=np.array([0.3, -3.5, 9.0, 6.4, 4.3])) | >>> st = Stream(traces=[tr1, tr2]) | >>> st.std() | [4.2614551505325036, 4.4348618918744247] | | taper(self, *args, **kwargs) | Taper all Traces in Stream. | | For details see the corresponding :meth:`~obspy.core.trace.Trace.taper` | method of :class:`~obspy.core.trace.Trace`. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | | trigger(self, type, **options) | Run a triggering algorithm on all traces in the stream. | | :param type: String that specifies which trigger is applied (e.g. | ``'recstalta'``). See the `Supported Trigger`_ section below for | further details. | :param options: Necessary keyword arguments for the respective | trigger that will be passed on. (e.g. ``sta=3``, ``lta=10``) | Arguments ``sta`` and ``lta`` (seconds) will be mapped to ``nsta`` | and ``nlta`` (samples) by multiplying with sampling rate of trace. | (e.g. ``sta=3``, ``lta=10`` would call the trigger with 3 and 10 | seconds average, respectively) | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data is not accessible anymore afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | This also makes an entry with information on the applied processing | in ``stats.processing`` of every trace. | | .. rubric:: _`Supported Trigger` | | ``'classicstalta'`` | Computes the classic STA/LTA characteristic function (uses | :func:`obspy.signal.trigger.classic_sta_lta`). | | ``'recstalta'`` | Recursive STA/LTA | (uses :func:`obspy.signal.trigger.recursive_sta_lta`). | | ``'recstaltapy'`` | Recursive STA/LTA written in Python (uses | :func:`obspy.signal.trigger.recursive_sta_lta_py`). | | ``'delayedstalta'`` | Delayed STA/LTA. | (uses :func:`obspy.signal.trigger.delayed_sta_lta`). | | ``'carlstatrig'`` | Computes the carl_sta_trig characteristic function (uses | :func:`obspy.signal.trigger.carl_sta_trig`). | | ``'zdetect'`` | Z-detector (uses :func:`obspy.signal.trigger.z_detect`). | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() | >>> st.filter("highpass", freq=1.0) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.plot() # doctest: +SKIP | >>> st.trigger('recstalta', sta=1, lta=4) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> st.plot() # doctest: +SKIP | | .. plot:: | | from obspy import read | st = read() | st.filter("highpass", freq=1.0) | st.plot() | st.trigger('recstalta', sta=1, lta=4) | st.plot() | | trim(self, starttime=None, endtime=None, pad=False, nearest_sample=True, fill_value=None) | Cut all traces of this Stream object to given start and end time. | | :type starttime: :class:`~obspy.core.utcdatetime.UTCDateTime`, optional | :param starttime: Specify the start time. | :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime`, optional | :param endtime: Specify the end time. | :type pad: bool, optional | :param pad: Gives the possibility to trim at time points outside the | time frame of the original trace, filling the trace with the | given ``fill_value``. Defaults to ``False``. | :type nearest_sample: bool, optional | :param nearest_sample: If set to ``True``, the closest sample is | selected, if set to ``False``, the inner (next sample for a | start time border, previous sample for an end time border) sample | containing the time is selected. Defaults to ``True``. | | Given the following trace containing 6 samples, "|" are the | sample points, "A" is the requested starttime:: | | | |A | | B | | | 1 2 3 4 5 6 | | ``nearest_sample=True`` will select samples 2-5, | ``nearest_sample=False`` will select samples 3-4 only. | | :type fill_value: int, float or ``None``, optional | :param fill_value: Fill value for gaps. Defaults to ``None``. Traces | will be converted to NumPy masked arrays if no value is given and | gaps are present. | | .. note:: | | This operation is performed in place on the actual data arrays. The | raw data will no longer be accessible afterwards. To keep your | original data, use :meth:`~obspy.core.stream.Stream.copy` to create | a copy of your stream object. | | .. rubric:: Example | | >>> st = read() | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples | >>> dt = UTCDateTime("2009-08-24T00:20:20") | >>> st.trim(dt, dt + 5) # doctest: +ELLIPSIS | <...Stream object at 0x...> | >>> print(st) # doctest: +ELLIPSIS | 3 Trace(s) in Stream: | BW.RJOB..EHZ | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples | BW.RJOB..EHN | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples | BW.RJOB..EHE | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples | | verify(self) | Verify all traces of current Stream against available meta data. | | .. rubric:: Example | | >>> from obspy import Trace, Stream | >>> tr = Trace(data=np.array([1, 2, 3, 4])) | >>> tr.stats.npts = 100 | >>> st = Stream([tr]) | >>> st.verify() #doctest: +ELLIPSIS | Traceback (most recent call last): | ... | Exception: ntps(100) differs from data size(4) | | write(self, filename, format=None, **kwargs) | Save stream into a file. | | :type filename: str | :param filename: The name of the file to write. | :type format: str, optional | :param format: The file format to use (e.g. ``"MSEED"``). See | the `Supported Formats`_ section below for a list of supported | formats. If format is set to ``None`` it will be deduced from | file extension, whenever possible. | :param kwargs: Additional keyword arguments passed to the underlying | waveform writer method. | | .. rubric:: Example | | >>> from obspy import read | >>> st = read() # doctest: +SKIP | >>> st.write("example.mseed", format="MSEED") # doctest: +SKIP | | The ``format`` argument can be omitted, and the file format will be | deduced from file extension, whenever possible. | | >>> st.write("example.mseed") # doctest: +SKIP | | Writing single traces into files with meaningful filenames can be done | e.g. using trace.id | | >>> for tr in st: #doctest: +SKIP | ... tr.write(tr.id + ".MSEED", format="MSEED") #doctest: +SKIP | | .. rubric:: _`Supported Formats` | | Additional ObsPy modules extend the parameters of the | :meth:`~obspy.core.stream.Stream.write` method. The following | table summarizes all known formats currently available for ObsPy. | | Please refer to the `Linked Function Call`_ of each module for any | extra options available. | | ====== ======================== ========================================= | Format Used Module _`Linked Function Call` | ====== ======================== ========================================= | AH :mod:`obspy.io.ah` :func:`obspy.io.ah.core._write_ah1` | GSE2 :mod:`obspy.io.gse2` :func:`obspy.io.gse2.core._write_gse2` | MSEED :mod:`obspy.io.mseed` :func:`obspy.io.mseed.core._write_mseed` | PICKLE :mod:`obspy.core.stream` :func:`obspy.core.stream._write_pickle` | Q :mod:`obspy.io.sh` :func:`obspy.io.sh.core._write_q` | SAC :mod:`obspy.io.sac` :func:`obspy.io.sac.core._write_sac` | SACXY :mod:`obspy.io.sac` :func:`obspy.io.sac.core._write_sac_xy` | SEGY :mod:`obspy.io.segy` :func:`obspy.io.segy.core._write_segy` | SH_ASC :mod:`obspy.io.sh` :func:`obspy.io.sh.core._write_asc` | SLIST :mod:`obspy.io.ascii` :func:`obspy.io.ascii.core._write_slist` | SU :mod:`obspy.io.segy` :func:`obspy.io.segy.core._write_su` | TSPAIR :mod:`obspy.io.ascii` :func:`obspy.io.ascii.core._write_tspair` | WAV :mod:`obspy.io.wav` :func:`obspy.io.wav.core._write_wav` | ====== ======================== ========================================= | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | __hash__ = None | | __slotnames__ = []
3.1 Melakukan Pemotongan Data (Trimming)¶
Pemotongan Stream
dan Trace
dapat dilakukan dengan perintah trim
, kita dapat melilhat parameter yang diperlukan dalam proses trim
:
help(st.trim)
Help on method trim in module obspy.core.stream: trim(starttime=None, endtime=None, pad=False, nearest_sample=True, fill_value=None) method of obspy.core.stream.Stream instance Cut all traces of this Stream object to given start and end time. :type starttime: :class:`~obspy.core.utcdatetime.UTCDateTime`, optional :param starttime: Specify the start time. :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime`, optional :param endtime: Specify the end time. :type pad: bool, optional :param pad: Gives the possibility to trim at time points outside the time frame of the original trace, filling the trace with the given ``fill_value``. Defaults to ``False``. :type nearest_sample: bool, optional :param nearest_sample: If set to ``True``, the closest sample is selected, if set to ``False``, the inner (next sample for a start time border, previous sample for an end time border) sample containing the time is selected. Defaults to ``True``. Given the following trace containing 6 samples, "|" are the sample points, "A" is the requested starttime:: | |A | | B | | 1 2 3 4 5 6 ``nearest_sample=True`` will select samples 2-5, ``nearest_sample=False`` will select samples 3-4 only. :type fill_value: int, float or ``None``, optional :param fill_value: Fill value for gaps. Defaults to ``None``. Traces will be converted to NumPy masked arrays if no value is given and gaps are present. .. note:: This operation is performed in place on the actual data arrays. The raw data will no longer be accessible afterwards. To keep your original data, use :meth:`~obspy.core.stream.Stream.copy` to create a copy of your stream object. .. rubric:: Example >>> st = read() >>> print(st) # doctest: +ELLIPSIS 3 Trace(s) in Stream: BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z ... | 100.0 Hz, 3000 samples >>> dt = UTCDateTime("2009-08-24T00:20:20") >>> st.trim(dt, dt + 5) # doctest: +ELLIPSIS <...Stream object at 0x...> >>> print(st) # doctest: +ELLIPSIS 3 Trace(s) in Stream: BW.RJOB..EHZ | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples BW.RJOB..EHN | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples BW.RJOB..EHE | 2009-08-24T00:20:20.000000Z ... | 100.0 Hz, 501 samples
Misalkan akan dilakukan pemotongan pada 2 detik pertama, maka sebelumnya kita bisa memberikan batas waktu tersebut. Dalam obspy
waktu diwakili oleh objek UTCDateTime
:
starttime = st[0].stats.starttime
print(starttime)
2021-03-21T05:56:43.000000Z
endtime = starttime + 5 # menambah 2 detik
print(endtime)
2021-03-21T05:56:48.000000Z
Selanjutnya kita terlebih dahulu dapat menyalin Stream
ke dalam Stream
baru agar yang lama tidak berubah (disarankan agar data asli tidak berubah karena trim menghilangkan data):
st_trim = st.copy()
print(st_trim)
1 Trace(s) in Stream: IA.ASJR.00.HNE | 2021-03-21T05:56:43.000000Z - 2021-03-21T06:31:43.000000Z | 100.0 Hz, 210001 samples
proses trimming kemudian dapat dilakukan:
st_trim.trim(starttime, endtime)
st_trim.plot()
3.2 Mengaplikasikan filter (Filtering)¶
Sama seperti pada proses trim kita juga dapat melihat petunjuk penggunaan filter
:
help(st.filter)
Help on method filter in module obspy.core.stream: filter(type, **options) method of obspy.core.stream.Stream instance Filter the data of all traces in the Stream. :type type: str :param type: String that specifies which filter is applied (e.g. ``"bandpass"``). See the `Supported Filter`_ section below for further details. :param options: Necessary keyword arguments for the respective filter that will be passed on. (e.g. ``freqmin=1.0``, ``freqmax=20.0`` for ``"bandpass"``) .. note:: This operation is performed in place on the actual data arrays. The raw data is not accessible anymore afterwards. To keep your original data, use :meth:`~obspy.core.stream.Stream.copy` to create a copy of your stream object. This also makes an entry with information on the applied processing in ``stats.processing`` of every trace. .. rubric:: _`Supported Filter` ``'bandpass'`` Butterworth-Bandpass (uses :func:`obspy.signal.filter.bandpass`). ``'bandstop'`` Butterworth-Bandstop (uses :func:`obspy.signal.filter.bandstop`). ``'lowpass'`` Butterworth-Lowpass (uses :func:`obspy.signal.filter.lowpass`). ``'highpass'`` Butterworth-Highpass (uses :func:`obspy.signal.filter.highpass`). ``'lowpass_cheby_2'`` Cheby2-Lowpass (uses :func:`obspy.signal.filter.lowpass_cheby_2`). ``'lowpass_fir'`` (experimental) FIR-Lowpass (uses :func:`obspy.signal.filter.lowpass_fir`). ``'remez_fir'`` (experimental) Minimax optimal bandpass using Remez algorithm (uses :func:`obspy.signal.filter.remez_fir`). .. rubric:: Example >>> from obspy import read >>> st = read() >>> st.filter("highpass", freq=1.0) # doctest: +ELLIPSIS <...Stream object at 0x...> >>> st.plot() # doctest: +SKIP .. plot:: from obspy import read st = read() st.filter("highpass", freq=1.0) st.plot()
Contoh untuk filter highpass dapat dilakukan dengan:
st_filt = st.copy()
st_filt.filter("highpass", freq=2)
st_filt.plot()
3.3 Melakukan Resampling¶
Resampling dapat dilakukan dengan menggunakan fungsi resample
:
st_resamp = st.copy()
st_resamp.resample(sampling_rate=20)
print(st_resamp)
st_resamp.plot()
1 Trace(s) in Stream: IA.ASJR.00.HNE | 2021-03-21T05:56:43.000000Z - 2021-03-21T06:31:42.950000Z | 20.0 Hz, 42000 samples
3.4 Menghilangkan trend¶
st_detrend = st.copy()
st_detrend.detrend()
st_detrend.plot()
3.5 Mengeplot spectogram¶
obspy
juga memungkinkan pengeplotan spectrogram dengan perintah yang sederhana. Misalkan kita ingin mengeplot spectrogram pada data yang sudah difilter:
st_filt.spectrogram()
[None]
4 Menyimpan Data¶
Setelah berbagai pengolahan, obspy
juga memberikan dukungan untuk menyimpan data dengan berbagai format, pada contoh disini data yang sudah difilter akan disimpan ke dalam file menggunakan Stream.write
:
st_filt.write("data_terfilter.mseed")
/usr/local/lib/python3.7/dist-packages/obspy/io/mseed/core.py:770: UserWarning: The encoding specified in trace.stats.mseed.encoding does not match the dtype of the data. A suitable encoding will be chosen. warnings.warn(msg, UserWarning)
Data yang sudah disimpan akan masuk di File Explorer Colab dan dapat diunduh.
5 Latihan¶
5.1 Membaca data seismik BLJR¶
st=read('isikan lokasi BLJR Z')
st+=read('isikan lokasi BLJR N')
st+=read('isikan lokasi BLJR E')
print(st)
--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-27-829127c7915b> in <module>() ----> 1 st=read('isikan lokasi BLJR Z') 2 st+=read('isikan lokasi BLJR N') 3 st+=read('isikan lokasi BLJR E') 4 print(st) <decorator-gen-145> in read(pathname_or_url, format, headonly, starttime, endtime, nearest_sample, dtype, apply_calib, check_compression, **kwargs) /usr/local/lib/python3.7/dist-packages/obspy/core/util/decorator.py in _map_example_filename(func, *args, **kwargs) 289 except IOError: 290 pass --> 291 return func(*args, **kwargs) 292 return _map_example_filename 293 /usr/local/lib/python3.7/dist-packages/obspy/core/stream.py in read(pathname_or_url, format, headonly, starttime, endtime, nearest_sample, dtype, apply_calib, check_compression, **kwargs) 206 st = _create_example_stream(headonly=headonly) 207 else: --> 208 st = _generic_reader(pathname_or_url, _read, **kwargs) 209 210 if len(st) == 0: /usr/local/lib/python3.7/dist-packages/obspy/core/util/base.py in _generic_reader(pathname_or_url, callback_func, **kwargs) 653 raise Exception("No file matching file pattern: %s" % pathname) 654 elif not glob.has_magic(pathname) and not Path(pathname).is_file(): --> 655 raise IOError(2, "No such file or directory", pathname) 656 657 generic = callback_func(pathnames[0], **kwargs) FileNotFoundError: [Errno 2] No such file or directory: 'isikan lokasi BLJR Z'
5.2 Mengeplot data seismik BLJR¶
# masukkan kode untuk mengeplot
5.3 Melakukan Filtering¶
# lakukan filter lowpass 5 hz dan plot
5.4 Menyimpan data¶
# simpan data ke dalam file dengan write