def download_datafile(self, start_date, end_date): """ Download a datafile container this spotters data from start_date to end_date :param start_date: Start date string :param end_date: End date String """ from pysofar.tools import parse_date self._session.grab_datafile(self.id, parse_date(start_date), parse_date(end_date))
def __init__(self, spotter_id: str, limit: int = 20, start_date=_MISSING, end_date=_MISSING, params=None): """ Query the Sofar api for spotter data :param spotter_id: String id of the spotter to query for :param limit: The limit of data to query. Defaults to 20, max of 100 for frequency data, max of 500 otherwise :param start_date: ISO8601 formatted string for start date, otherwise if not included, defaults to a date arbitrarily far back to include all spotter data :param end_date: ISO8601 formatted string for end date, otherwise if not included defaults to present :param params: Defaults to None. Parameters to overwrite/add to the default query parameter set """ super().__init__() self.spotter_id = spotter_id self._limit = limit if start_date is self._MISSING or start_date is None: self.start_date = None else: self.start_date = parse_date(start_date) if end_date is self._MISSING or end_date is None: self.end_date = None else: self.end_date = parse_date(end_date) self._params = { 'spotterId': spotter_id, 'limit': limit, 'includeWaves': 'true', 'includeWindData': 'false', 'includeTrack': 'false', 'includeFrequencyData': 'false', 'includeDirectionalMoments': 'false', 'includeSurfaceTempData': 'false', 'includeNonObs': 'false' } if params is not None: self._params.update(params) if self.start_date is not None: self._params.update({'startDate': self.start_date}) if self.end_date is not None: self._params.update({'endDate': self.end_date})
def test_parse_date_datetime(): # test passing in a datetime works ts = datetime(1997, 2, 16, 5, 25) dt = parse_date(ts) assert dt is not None assert dt == '1997-02-16T05:25:00.000Z'
def test_parse_date_string_utc_offset(): # test Y-M-DTH:M:S parses ts = '1985-11-15T12:34:56.000+00:00' dt = parse_date(ts) assert dt is not None assert dt == '1985-11-15T12:34:56.000Z'
def test_parse_date_string_no_milliseconds(): # test Y-M-DTH:M:S parses ts = '1985-11-15T12:34:56' dt = parse_date(ts) assert dt is not None assert dt == '1985-11-15T12:34:56.000Z'
def test_parse_date_string_only_days(): # test Y-M-D parses ts = '1985-11-15' dt = parse_date(ts) assert dt is not None assert dt == '1985-11-15T00:00:00.000Z'
def test_parse_date_string(): # test iso representation parses correctly ts = '1985-11-15T12:34:56.000Z' dt = parse_date(ts) assert dt is not None assert dt == '1985-11-15T12:34:56.000Z'
def test_parse_date_datetime_aware(): # test passing in aware datetime from datetime import timezone ts = datetime.now(tz=timezone.utc) dt = parse_date(ts) assert dt is not None
def test_time_stamp_to_epoch(): ts = '1985-11-15T23:56:12.000Z' epoch = time_stamp_to_epoch(ts) assert isinstance(epoch, int) dt = parse_date(epoch) assert dt == ts
def set_end_date(self, new_date: str): self.end_date = parse_date(new_date) self._params.update({'endDate': self.end_date})
def set_start_date(self, new_date: str): self.start_date = parse_date(new_date) self._params.update({'startDate': self.start_date})
def test_parse_date_datetime_unaware(): # passing in another datetime func ts = datetime.utcnow() dt = parse_date(ts) assert dt is not None