Source code for quakemigrate.io.availability

# -*- coding: utf-8 -*-
"""
Module to handle input/output of StationAvailability.csv files.

:copyright:
    2020, QuakeMigrate developers.
:license:
    GNU General Public License, Version 3
    (https://www.gnu.org/licenses/gpl-3.0.html)

"""

import logging

from obspy import UTCDateTime
import pandas as pd

import quakemigrate.util as util


[docs]def read_availability(run, starttime, endtime): """ Read in station availability data to a `pandas.DataFrame` from csv files split by Julian day. Parameters ---------- run : :class:`~quakemigrate.io.Run` object Light class encapsulating i/o path information for a given run. starttime : `obspy.UTCDateTime` object Timestamp from which to read the station availability. endtime : `obspy.UTCDateTime` object Timestamp up to which to read the station availability. Returns ------- availability : `pandas.DataFrame` object Details the availability of each station for each timestep of detect. """ fpath = run.path / "detect" / "availability" startday = UTCDateTime(starttime.date) dy = 0 availability = None # Loop through days trying to read .StationAvailability files logging.debug("\t Reading in .StationAvailability...") while startday + (dy * 86400) <= endtime: now = starttime + (dy * 86400) fstem = f"{now.year}_{now.julday:03d}_StationAvailability" file = (fpath / fstem).with_suffix(".csv") try: if availability is None: availability = pd.read_csv(file, index_col=0) else: tmp = pd.read_csv(file, index_col=0) availability = pd.concat([availability, tmp]) except FileNotFoundError: logging.info("\tNo .StationAvailability file found for " f"{now.year} - {now.julday:03d}") dy += 1 if availability is None: raise util.NoStationAvailabilityDataException starttime, endtime = availability.index[0], availability.index[-1] logging.debug(f"\t\t...from {starttime} - {endtime}") return availability
[docs]def write_availability(run, availability): """ Write out csv files (split by Julian day) containing station availability data. Parameters ---------- run : :class:`~quakemigrate.io.Run` object Light class encapsulating i/o path information for a given run. availability : `pandas.DataFrame` object Details the availability of each station for each timestep of detect. """ fpath = run.path / "detect" / "availability" fpath.mkdir(exist_ok=True, parents=True) availability.index = times = pd.to_datetime(availability.index) datelist = set([time.date() for time in times]) for date in datelist: to_write = availability[availability.index.date == date] to_write.index = [UTCDateTime(idx) for idx in to_write.index] date = UTCDateTime(date) fstem = f"{date.year}_{date.julday:03d}_StationAvailability" file = (fpath / fstem).with_suffix(".csv") to_write.to_csv(file)