Source code for rubin_sim.maf.stackers.date_stackers

__all__ = (
    "ObservationStartDatetime64Stacker",
    "DayObsStacker",
    "DayObsMJDStacker",
    "DayObsISOStacker",
)

import numpy as np
from astropy.time import Time

from .base_stacker import BaseStacker


[docs] class ObservationStartDatetime64Stacker(BaseStacker): """Add the observation start time as a numpy.datetime64.""" cols_added = ["observationStartDatetime64"] def __init__( self, mjd_col="observationStartMJD", ): self.mjd_col = mjd_col self.cols_req = [self.mjd_col] self.units = [None] self.cols_added_dtypes = ["datetime64[ns]"] def _run(self, sim_data, cols_present=False): if cols_present: # Column already present in data; assume it is correct and does not # need recalculating. return sim_data sim_data["observationStartDatetime64"] = Time(sim_data[self.mjd_col], format="mjd").datetime64 return sim_data
def _compute_day_obs_mjd(mjd): day_obs_mjd = np.floor(mjd - 0.5).astype("int") return day_obs_mjd def _compute_day_obs_astropy_time(mjd): day_obs_time = Time(_compute_day_obs_mjd(mjd), format="mjd") return day_obs_time def _compute_day_obs_iso8601(mjd): iso_times = _compute_day_obs_astropy_time(mjd).iso # Work both for mjd as a scalar and a numpy array if isinstance(iso_times, str): day_obs_iso = iso_times[:10] else: day_obs_iso = np.array([d[:10] for d in iso_times]) return day_obs_iso def _compute_day_obs_int(mjd): day_obs_int = np.array([d.replace("-", "") for d in _compute_day_obs_iso8601(mjd)]) return day_obs_int
[docs] class DayObsStacker(BaseStacker): """Add dayObs as, as defined by SITCOMTN-32. Parameters ---------- mjd_col : `str` The column with the observatin start MJD. """ cols_added = ["dayObs"] def __init__(self, mjd_col="observationStartMJD"): self.mjd_col = mjd_col self.cols_req = [self.mjd_col] self.units = ["days"] self.cols_added_dtypes = [int] def _run(self, sim_data, cols_present=False): if cols_present: # Column already present in data; assume it is correct and does not # need recalculating. return sim_data sim_data[self.cols_added[0]] = _compute_day_obs_int(sim_data[self.mjd_col]) return sim_data
[docs] class DayObsMJDStacker(BaseStacker): """Add dayObs defined by SITCOMTN-32, as an MJD. Parameters ---------- mjd_col : `str` The column with the observatin start MJD. """ cols_added = ["day_obs_mjd"] def __init__(self, mjd_col="observationStartMJD"): self.mjd_col = mjd_col self.cols_req = [self.mjd_col] self.units = ["days"] self.cols_added_dtypes = [int] def _run(self, sim_data, cols_present=False): if cols_present: # Column already present in data; assume it is correct and does not # need recalculating. return sim_data sim_data[self.cols_added[0]] = _compute_day_obs_mjd(sim_data[self.mjd_col]) return sim_data
[docs] class DayObsISOStacker(BaseStacker): """Add dayObs as defined by SITCOMTN-32, in ISO 8601 format. Parameters ---------- mjd_col : `str` The column with the observatin start MJD.""" cols_added = ["day_obs_iso8601"] def __init__(self, mjd_col="observationStartMJD"): self.mjd_col = mjd_col self.cols_req = [self.mjd_col] self.units = [None] self.cols_added_dtypes = [(str, 10)] def _run(self, sim_data, cols_present=False): if cols_present: # Column already present in data; assume it is correct and does not # need recalculating. return sim_data sim_data[self.cols_added[0]] = _compute_day_obs_iso8601(sim_data[self.mjd_col]) return sim_data