Source code for obsplus.waveforms.get_waveforms

"""
Module for adding the client-like "get_waveforms" to the Stream class
"""
from typing import Optional

import numpy as np
import obspy
from obspy import Stream, UTCDateTime as UTC

from obsplus.constants import SMALLDT64, LARGEDT64, NSLC, bulk_waveform_arg_type
from obsplus.utils.time import to_utc
from obsplus.utils.waveforms import (
    _get_waveform_df,
    get_waveform_bulk_df,
    _filter_index_to_bulk,
    merge_traces,
)


[docs] def get_waveforms( stream: Stream, network: str = "*", station: str = "*", location: str = "*", channel: str = "*", starttime: Optional[UTC] = None, endtime: Optional[UTC] = None, ) -> obspy.Stream: """ A subset of the Client.get_waveforms method. Simply makes successive calls to Stream.select and Stream.trim under the hood. Matching is available on all str parameters. Parameters ---------- stream A stream object. network The network code station The station code location Location code channel Channel code starttime Starttime for query endtime Endtime for query """ t1, t2 = to_utc(starttime or SMALLDT64), to_utc(endtime or LARGEDT64) kwargs = {c: v for c, v in zip(NSLC, [network, station, location, channel])} st = stream.select(**kwargs).slice(starttime=t1, endtime=t2).copy() return st
[docs] def get_waveforms_bulk( stream: Stream, bulk: bulk_waveform_arg_type, **kwargs ) -> Stream: """ Get a large number of waveforms with a bulk request. Parameters ---------- stream A stream object. bulk A list of any number of tuples containing the following: (network, station, location, channel, starttime, endtime). """ # get a dataframe of stream contents index = _get_waveform_df(stream) # get a dataframe of the bulk arguments, convert time to datetime64 request_df = get_waveform_bulk_df(bulk) if not len(request_df): # return empty string if no bulk reqs provided return obspy.Stream() # get unique times and check conditions for string columns unique_times = np.unique(request_df[["starttime", "endtime"]].values, axis=0) traces = [] for t1, t2 in unique_times: sub = _filter_index_to_bulk((t1, t2), index_df=index, bulk_df=request_df) new = obspy.Stream(traces=[x.data for x in sub["trace"]]).slice( starttime=to_utc(t1), endtime=to_utc(t2) ) traces.extend(new.traces) return merge_traces(obspy.Stream(traces=traces))
# --- add get_waveforms to Stream class obspy.Stream.get_waveforms = get_waveforms obspy.Stream.get_waveforms_bulk = get_waveforms_bulk