|
3 | 3 | import datetime as dt |
4 | 4 | import numpy as np |
5 | 5 | import pyproj |
| 6 | +import calendar |
| 7 | +from functools import cached_property |
6 | 8 |
|
7 | 9 | from geodataset.geodataset import GeoDatasetRead |
8 | 10 | from geodataset.utils import InvalidDatasetError |
@@ -237,3 +239,67 @@ def datetime_bounds(self): |
237 | 239 | dto - dt.timedelta(hours=12), |
238 | 240 | dto + dt.timedelta(hours=12), |
239 | 241 | ])] |
| 242 | + |
| 243 | + |
| 244 | +class PIOMASModelFile(CustomDatasetRead): |
| 245 | + |
| 246 | + grid_mapping = (pyproj.CRS.from_proj4( |
| 247 | + '+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +x_0=0 +y_0=0 ' |
| 248 | + '+ellps=WGS84 +units=m +no_defs'), 'absent') |
| 249 | + pattern = re.compile(r'PIOMAS_\d{4}.nc') |
| 250 | + |
| 251 | + @cached_property |
| 252 | + def is_lonlat_dim(self): |
| 253 | + """ |
| 254 | + Returns: |
| 255 | + -------- |
| 256 | + is_lonlat_dim : bool |
| 257 | + True if lon,lat are dimensions |
| 258 | + """ |
| 259 | + return True |
| 260 | + |
| 261 | + def get_lonlat_arrays(self, ij_range=(None, None, None, None), **kwargs): |
| 262 | + """ Get array with longitude latidtude arrays |
| 263 | +
|
| 264 | + Parameters |
| 265 | + ---------- |
| 266 | + ij_range : tuple with 4 ints |
| 267 | + start/stop along i and j (y and x) axis |
| 268 | + kwargs : dict |
| 269 | + dummy |
| 270 | +
|
| 271 | + Returns |
| 272 | + ------- |
| 273 | + lon : numpy.ndarray |
| 274 | + 2D array with longitude |
| 275 | + lat : numpy.ndarray |
| 276 | + 2D array with latitude |
| 277 | + """ |
| 278 | + i0, i1, j0, j1 = ij_range |
| 279 | + lon = self['longitude'][i0:i1, j0:j1] |
| 280 | + lat = self['latitude'][i0:i1, j0:j1] |
| 281 | + return lon, lat |
| 282 | + |
| 283 | + @property |
| 284 | + def datetime_bounds(self): |
| 285 | + """ |
| 286 | + Datetimes are the start and end of day |
| 287 | +
|
| 288 | + Returns: |
| 289 | + -------- |
| 290 | + datetime_bounds : list(np.array) |
| 291 | + each element is an array [dto1, dto2], where |
| 292 | + hi |
| 293 | + dto1: datetime.datetime |
| 294 | + start of observation interval |
| 295 | + dto2: datetime.datetime |
| 296 | + end of observation interval |
| 297 | + """ |
| 298 | + bnds = [] |
| 299 | + for dto in self.datetimes: |
| 300 | + ym = (dto.year, dto.month) |
| 301 | + dto1 = dt.datetime(*ym, 1) |
| 302 | + _, ndays = calendar.monthrange(*ym) |
| 303 | + dto2 = dto1 + dt.timedelta(ndays) |
| 304 | + bnds += [np.array([dto1, dto2])] |
| 305 | + return bnds |
0 commit comments