def test_solar_offset(): from datacube.utils.geometry import point from datetime import timedelta def _hr(t): return t.days * 24 + t.seconds / 3600 def p(lon): return point(lon, 0, 'epsg:4326') assert solar_offset(p(0)) == timedelta(seconds=0) assert solar_offset(p(0).to_crs('epsg:3857')) == timedelta(seconds=0) assert solar_offset(p(179.9)) == timedelta(hours=12) assert _hr(solar_offset(p(-179.9))) == -12.0 assert solar_offset(p(20), 's') != solar_offset(p(20), 'h') assert solar_offset(p(20), 's') < solar_offset(p(21), 's') _s = SimpleNamespace ds = _s(center_time=parse_time('1987-05-22 23:07:44.2270250Z'), metadata=_s(lon=Range(begin=150.415, end=152.975))) assert solar_offset(ds) == timedelta(hours=10) ds.metadata = _s() with pytest.raises(ValueError): solar_offset(ds)
def _parse_time_range(time: str) -> Tuple[datetime, datetime]: """ >>> _parse_time_range('1986-04-16T01:12:16/2097-05-10T00:24:21') (datetime.datetime(1986, 4, 16, 1, 12, 16), datetime.datetime(2097, 5, 10, 0, 24, 21)) >>> _parse_time_range('1986-04-16T01:12:16') (datetime.datetime(1986, 4, 16, 1, 12, 16), datetime.datetime(1986, 4, 16, 1, 12, 17)) >>> _parse_time_range('1986-04-16') (datetime.datetime(1986, 4, 16, 0, 0), datetime.datetime(1986, 4, 17, 0, 0)) """ time_period = time.split("/") if len(time_period) == 2: return parse_time(time_period[0]), parse_time(time_period[1]) elif len(time_period) == 1: t: datetime = parse_time(time_period[0]) if t.time() == dt_time(): return t, t + timedelta(days=1) else: return t, t + timedelta(seconds=1)
def _parse_time_range(time: str) -> Optional[Tuple[datetime, datetime]]: """ >>> _parse_time_range('1986-04-16T01:12:16/2097-05-10T00:24:21') (datetime.datetime(1986, 4, 16, 1, 12, 16), datetime.datetime(2097, 5, 10, 0, 24, 21)) >>> _parse_time_range('1986-04-16T01:12:16') (datetime.datetime(1986, 4, 16, 1, 12, 16), datetime.datetime(1986, 4, 16, 1, 12, 17)) >>> # Time is optional: >>> _parse_time_range('2019-01-01/2019-01-01') (datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 1, 1, 0, 0)) >>> _parse_time_range('1986-04-16') (datetime.datetime(1986, 4, 16, 0, 0), datetime.datetime(1986, 4, 17, 0, 0)) >>> # Open ranges: >>> _parse_time_range('2019-01-01/..')[0] datetime.datetime(2019, 1, 1, 0, 0) >>> _parse_time_range('2019-01-01/..')[1] > datetime.now() True >>> _parse_time_range('../2019-01-01') (datetime.datetime(1971, 1, 1, 0, 0), datetime.datetime(2019, 1, 1, 0, 0)) >>> # Unbounded time is the same as no time filter. ("None") >>> _parse_time_range('../..') >>> """ time_period = time.split("/") if len(time_period) == 2: start, end = time_period if start == "..": start = datetime(1971, 1, 1, 0, 0) elif end == "..": end = datetime.now() + timedelta(days=2) # Were they both open? Treat it as no date filter. if end == "..": return None return parse_time(start), parse_time(end) elif len(time_period) == 1: t: datetime = parse_time(time_period[0]) if t.time() == dt_time(): return t, t + timedelta(days=1) else: return t, t + timedelta(seconds=1)
def dataset_created(dataset: Dataset) -> Optional[datetime]: if "created" in dataset.metadata.fields: return dataset.metadata.created value = dataset.metadata.creation_dt if value: try: return default_utc(dc_utils.parse_time(value)) except ValueError: _LOG.warn("invalid_dataset.creation_dt", dataset_id=dataset.id, value=value) return None
def test_solar_day(): _s = SimpleNamespace ds = _s(center_time=parse_time('1987-05-22 23:07:44.2270250Z'), metadata=_s(lon=Range(begin=150.415, end=152.975))) assert solar_day(ds) == np.datetime64('1987-05-23', 'D') assert solar_day(ds, longitude=0) == np.datetime64('1987-05-22', 'D') ds.metadata = _s() with pytest.raises(ValueError) as e: solar_day(ds) assert 'Cannot compute solar_day: dataset is missing spatial info' in str(e.value)
def with_parsed_datetimes(v: Dict, name=""): """ All date fields in eo3 metadata have names ending in 'datetime'. Return a doc with all of these fields parsed as actual dates. (they are convertered to strings on datacube index and other json-ification) """ if not v: return v if name.endswith("datetime"): dt = parse_time(v) # Strip/normalise timezone to match default yaml.load() if dt.tzinfo: dt = dt.astimezone(tzutc()).replace(tzinfo=None) return dt elif isinstance(v, dict): return {k: with_parsed_datetimes(v, name=k) for k, v in v.items()} elif isinstance(v, list): return [with_parsed_datetimes(i) for i in v] return v
def time(self) -> Optional[Range]: try: time = self.metadata.time return Range(parse_time(time.begin), parse_time(time.end)) except AttributeError: return None
def time(self): time = self.metadata.time return Range(parse_time(time.begin), parse_time(time.end))
def parse_value(self, s): return utils.parse_time(s)
def parse_value(self, value): return utils.parse_time(value)
def time(self): time = self.metadata.time return Range(parse_time(time.begin), parse_time(time.begin))