weatherdb 1.1.0__py3-none-any.whl → 1.1.2__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- weatherdb/_version.py +1 -1
- weatherdb/cli.py +18 -3
- weatherdb/station/GroupStation.py +6 -3
- weatherdb/station/StationBases.py +5 -3
- weatherdb/utils/get_data.py +204 -40
- {weatherdb-1.1.0.dist-info → weatherdb-1.1.2.dist-info}/METADATA +2 -2
- {weatherdb-1.1.0.dist-info → weatherdb-1.1.2.dist-info}/RECORD +17 -17
- {weatherdb-1.1.0.dist-info → weatherdb-1.1.2.dist-info}/WHEEL +1 -1
- /docs/source/api/{weatherDB.config.rst → weatherdb.config.rst} +0 -0
- /docs/source/api/{weatherDB.db.rst → weatherdb.db.rst} +0 -0
- /docs/source/api/{weatherDB.rst → weatherdb.rst} +0 -0
- /docs/source/api/{weatherDB.station.rst → weatherdb.station.rst} +0 -0
- /docs/source/api/{weatherDB.stations.rst → weatherdb.stations.rst} +0 -0
- /docs/source/api/{weatherDB.utils.rst → weatherdb.utils.rst} +0 -0
- {weatherdb-1.1.0.dist-info → weatherdb-1.1.2.dist-info}/LICENSE +0 -0
- {weatherdb-1.1.0.dist-info → weatherdb-1.1.2.dist-info}/entry_points.txt +0 -0
- {weatherdb-1.1.0.dist-info → weatherdb-1.1.2.dist-info}/top_level.txt +0 -0
weatherdb/_version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "1.1.
|
1
|
+
__version__ = "1.1.2"
|
weatherdb/cli.py
CHANGED
@@ -103,10 +103,16 @@ def download_ma_rasters(which, overwrite, update_user_config):
|
|
103
103
|
"""
|
104
104
|
click.echo("starting downloading multi annual raster data")
|
105
105
|
from weatherdb.utils.get_data import download_ma_rasters
|
106
|
-
download_ma_rasters(
|
106
|
+
download_ma_rasters(
|
107
|
+
which=which,
|
108
|
+
overwrite=overwrite,
|
109
|
+
update_user_config=update_user_config)
|
107
110
|
|
108
111
|
|
109
112
|
@cli.command(short_help="Download the needed digital elevation model raster data from Copernicus to the data folder.")
|
113
|
+
@click.option('--out-dir', '-d',
|
114
|
+
type=click.Path(), default=None, show_default=False,
|
115
|
+
help="The directory to save the downloaded DEM data to.")
|
110
116
|
@click.option('--overwrite/--no-overwrite', '-o/-no-o',
|
111
117
|
type=bool, is_flag=True, default=None, show_default=False,
|
112
118
|
help="Should the digital elevation model raster be downloaded even if it already exists?")
|
@@ -116,7 +122,11 @@ def download_ma_rasters(which, overwrite, update_user_config):
|
|
116
122
|
@click.option("--update-user-config", "-u",
|
117
123
|
type=bool, default=False, show_default=True, is_flag=True,
|
118
124
|
help="Should the user configuration be updated with the path to the downloaded DEM?")
|
119
|
-
|
125
|
+
@click.option("--service", "-s",
|
126
|
+
type=str, default=["prism", "openTopography"], show_default=True, multiple=True,
|
127
|
+
help="The service to use to download the DEM. Options are 'prism' or 'openTopography'. " +\
|
128
|
+
"You can use this option muultiple times to test both in the given order until the file could be downloaded.")
|
129
|
+
def download_dem(out_dir, overwrite, extent, update_user_config, service="prism"):
|
120
130
|
"""Download the newest DEM data from the Copernicus Sentinel dataset.
|
121
131
|
|
122
132
|
Only the GLO-30 DEM, wich has a 30m resolution, is downloaded as it is freely available.
|
@@ -131,7 +141,12 @@ def download_dem(overwrite, extent):
|
|
131
141
|
"""
|
132
142
|
click.echo("Starting downloading digital elevation model from Copernicus")
|
133
143
|
from weatherdb.utils.get_data import download_dem
|
134
|
-
download_dem(
|
144
|
+
download_dem(
|
145
|
+
out_dir=out_dir,
|
146
|
+
overwrite=overwrite,
|
147
|
+
extent=extent,
|
148
|
+
service=service,
|
149
|
+
update_user_config=update_user_config)
|
135
150
|
|
136
151
|
|
137
152
|
# cli statements to update the database
|
@@ -526,7 +526,9 @@ class GroupStation(object):
|
|
526
526
|
period_new = period_filled.union(
|
527
527
|
period,
|
528
528
|
how="inner")
|
529
|
-
if period_new != period
|
529
|
+
if period_new != period and not (
|
530
|
+
(period.start == period_new.start) and
|
531
|
+
((period.end - period_new.end) <= pd.Timedelta(days=1))):
|
530
532
|
warnings.warn(
|
531
533
|
f"The Period for Station {self.id} got changed from {str(period)} to {str(period_new)}.")
|
532
534
|
period = period_new
|
@@ -599,8 +601,9 @@ class GroupStation(object):
|
|
599
601
|
|
600
602
|
# create header
|
601
603
|
if add_meta:
|
602
|
-
|
603
|
-
|
604
|
+
tabs = "\t" * (len(df.columns)-1)
|
605
|
+
header = f"Name: {name}{tabs}\n" +\
|
606
|
+
f"Lat: {y[0]} ,Lon: {x[0]}{tabs}\n"
|
604
607
|
else:
|
605
608
|
header = ""
|
606
609
|
|
@@ -504,10 +504,12 @@ class StationBase:
|
|
504
504
|
'{interval}'::INTERVAL)::{tstp_dtype} AS timestamp)
|
505
505
|
INSERT INTO timeseries."{stid}_{para}"(timestamp)
|
506
506
|
(SELECT wts.timestamp
|
507
|
-
|
508
|
-
|
507
|
+
FROM whole_ts wts
|
508
|
+
LEFT JOIN timeseries."{stid}_{para}" ts
|
509
509
|
ON ts.timestamp=wts.timestamp
|
510
|
-
|
510
|
+
WHERE ts.timestamp IS NULL);
|
511
|
+
DELETE FROM timeseries."{stid}_{para}"
|
512
|
+
WHERE timestamp < '{min_date} 00:00'::{tstp_dtype};
|
511
513
|
""".format(
|
512
514
|
stid=self.id,
|
513
515
|
para=self._para,
|
weatherdb/utils/get_data.py
CHANGED
@@ -6,9 +6,19 @@ from pathlib import Path
|
|
6
6
|
from distutils.util import strtobool
|
7
7
|
import hashlib
|
8
8
|
import progressbar as pb
|
9
|
+
import keyring
|
10
|
+
import os
|
11
|
+
import getpass
|
12
|
+
import logging
|
9
13
|
|
10
14
|
from ..config import config
|
11
15
|
|
16
|
+
__all__ = ["download_ma_rasters", "download_dem"]
|
17
|
+
|
18
|
+
log = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
# Multi annual rasters
|
21
|
+
# --------------------
|
12
22
|
def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
|
13
23
|
"""Get the multi annual rasters on which bases the regionalisation is done.
|
14
24
|
|
@@ -60,7 +70,7 @@ def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
|
|
60
70
|
if file_key in which:
|
61
71
|
# check if file is in config
|
62
72
|
if f"data:rasters:{file_key}" not in config:
|
63
|
-
|
73
|
+
log.debug(f"Skipping {file_key} as it is not in your configuration.\nPlease add a section 'data:rasters:{file_key}' to your configuration file.")
|
64
74
|
continue
|
65
75
|
|
66
76
|
# check if file already exists
|
@@ -75,7 +85,7 @@ def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
|
|
75
85
|
"Do you want to overwrite it? [y/n] "))
|
76
86
|
|
77
87
|
if skip:
|
78
|
-
|
88
|
+
log.debug(f"Skipping {file_key} as overwriting is not allowed.")
|
79
89
|
continue
|
80
90
|
|
81
91
|
# check if the directory exists
|
@@ -126,24 +136,42 @@ def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
|
|
126
136
|
if config.has_user_config:
|
127
137
|
config.update_user_config(f"data:rasters:{file_key}", "file", str(file_path))
|
128
138
|
else:
|
129
|
-
|
139
|
+
log.error(f"No user configuration file found, therefor the raster '{file_key}' is not set in the user configuration file.")
|
130
140
|
|
141
|
+
# DEM data
|
142
|
+
# --------
|
143
|
+
def _check_write_fp(fp, overwrite):
|
144
|
+
"""Check if a file exists and if it should be overwritten.
|
131
145
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
146
|
+
Parameters
|
147
|
+
----------
|
148
|
+
fp : str or Path
|
149
|
+
The path to the file to check.
|
150
|
+
overwrite : bool
|
151
|
+
Should the file be overwritten?
|
152
|
+
|
153
|
+
Returns
|
154
|
+
-------
|
155
|
+
bool
|
156
|
+
Should the file be written?
|
157
|
+
"""
|
158
|
+
fp = Path(fp)
|
159
|
+
if fp.exists():
|
160
|
+
log.info(f"The file already exists at {fp}.")
|
161
|
+
if overwrite is None:
|
162
|
+
overwrite = strtobool(input(f"{fp} already exists. Do you want to overwrite it? [y/n] "))
|
163
|
+
if not overwrite:
|
164
|
+
log.info("Skipping, because overwritting was turned of.")
|
165
|
+
return False
|
166
|
+
return True
|
141
167
|
|
142
|
-
|
143
|
-
|
168
|
+
def _download_dem_prism(out_dir, overwrite=None, extent=(5.3, 46.1, 15.6, 55.4)):
|
169
|
+
"""Download the DEM data from the Copernicus PRISM service.
|
144
170
|
|
145
171
|
Parameters
|
146
172
|
----------
|
173
|
+
out_dir: str or Path
|
174
|
+
The directory to save the DEM data to.
|
147
175
|
overwrite : bool, optional
|
148
176
|
Should the DEM data be downloaded even if it already exists?
|
149
177
|
If None the user will be asked.
|
@@ -151,9 +179,11 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
|
|
151
179
|
extent : tuple, optional
|
152
180
|
The extent in WGS84 of the DEM data to download.
|
153
181
|
The default is the boundary of germany + ~40km = (5.3, 46.1, 15.6, 55.4).
|
154
|
-
|
155
|
-
|
156
|
-
|
182
|
+
|
183
|
+
Returns
|
184
|
+
-------
|
185
|
+
fp : Path
|
186
|
+
The path to the downloaded DEM file.
|
157
187
|
"""
|
158
188
|
# import necessary modules
|
159
189
|
import rasterio as rio
|
@@ -164,10 +194,8 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
|
|
164
194
|
import re
|
165
195
|
import json
|
166
196
|
|
167
|
-
#
|
168
|
-
|
169
|
-
dem_dir = base_dir / "DEM"
|
170
|
-
dem_dir.mkdir(parents=True, exist_ok=True)
|
197
|
+
# check dir
|
198
|
+
out_dir = Path(out_dir)
|
171
199
|
|
172
200
|
# get available datasets
|
173
201
|
prism_url = "https://prism-dem-open.copernicus.eu/pd-desk-open-access/publicDemURLs"
|
@@ -191,20 +219,12 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
|
|
191
219
|
)[-1]["id"]
|
192
220
|
|
193
221
|
# check if dataset already exists
|
194
|
-
dem_file =
|
195
|
-
if dem_file
|
196
|
-
|
197
|
-
if overwrite is None:
|
198
|
-
overwrite = strtobool(input("Do you want to overwrite it? [y/n] "))
|
199
|
-
if not overwrite:
|
200
|
-
print("Skipping, because overwritting was turned of.")
|
201
|
-
return
|
202
|
-
else:
|
203
|
-
print("Overwriting the dataset.")
|
204
|
-
dem_dir.mkdir(exist_ok=True)
|
222
|
+
dem_file = out_dir / f'{ds_id.replace("/", "__")}.tif'
|
223
|
+
if not _check_write_fp(dem_file, overwrite):
|
224
|
+
return
|
205
225
|
|
206
226
|
# selecting DEM tiles
|
207
|
-
|
227
|
+
log.info(f"getting available tiles for Copernicus dataset '{ds_id}'")
|
208
228
|
ds_files_req = json.loads(
|
209
229
|
requests.get(
|
210
230
|
f"{prism_url}/{ds_id.replace('/', '__')}",
|
@@ -225,13 +245,13 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
|
|
225
245
|
ds_files_all))
|
226
246
|
|
227
247
|
# download DEM tiles
|
228
|
-
|
248
|
+
log.info("downloading tiles")
|
229
249
|
with TemporaryDirectory() as tmp_dir:
|
230
250
|
tmp_dir_fp = Path(tmp_dir)
|
231
251
|
for f in pb.progressbar(ds_files):
|
232
252
|
with open(tmp_dir_fp / Path(f["nativeDemUrl"]).name, "wb") as d:
|
233
253
|
d.write(requests.get(f["nativeDemUrl"]).content)
|
234
|
-
|
254
|
+
log.info("downloaded all files")
|
235
255
|
|
236
256
|
# extracting tifs from tars
|
237
257
|
for i, f in pb.progressbar(list(enumerate(tmp_dir_fp.glob("*.tar")))):
|
@@ -269,17 +289,161 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
|
|
269
289
|
tmp_eula_fp = next(tmp_dir_fp.glob("*.pdf"))
|
270
290
|
shutil.copyfile(
|
271
291
|
tmp_eula_fp,
|
272
|
-
|
292
|
+
out_dir / tmp_eula_fp.name
|
273
293
|
)
|
274
294
|
|
275
|
-
|
295
|
+
log.info(f"created DEM at '{dem_file}'.")
|
296
|
+
return dem_file
|
297
|
+
|
298
|
+
def _download_dem_opentopo(
|
299
|
+
out_dir,
|
300
|
+
overwrite=None,
|
301
|
+
extent=(5.3, 46.1, 15.6, 55.4),
|
302
|
+
api_key=os.environ.get(
|
303
|
+
"WEATHERDB_OPENTOPO_API_KEY",
|
304
|
+
fallback=keyring.get_password("weatherdb", "opentopo_api_key"))):
|
305
|
+
"""Download the DEM data from the OpenTopography service.
|
306
|
+
|
307
|
+
Get an API key from (OpenTopography)[https://portal.opentopography.org/] to use this service.
|
308
|
+
|
309
|
+
Parameters
|
310
|
+
----------
|
311
|
+
out_dir : str or Path
|
312
|
+
The directory to save the DEM data to.
|
313
|
+
overwrite : bool, optional
|
314
|
+
Should the DEM data be downloaded even if it already exists?
|
315
|
+
If None the user will be asked.
|
316
|
+
The default is None.
|
317
|
+
extent : tuple, optional
|
318
|
+
The extent in WGS84 of the DEM data to download.
|
319
|
+
Should be in the format (south, west, north, east).
|
320
|
+
The default is the boundary of germany + ~40km = (5.3, 46.1, 15.6, 55.4).
|
321
|
+
api_key : str, optional
|
322
|
+
The API key for the OpenTopography service.
|
323
|
+
If None the user will be asked.
|
324
|
+
The default is to check if the environment variable "WEATHERDB_OPENTOPO_API_KEY" is set or if the keyring has a password for "weatherdb" and "opentopo_api_key".
|
325
|
+
|
326
|
+
Returns
|
327
|
+
-------
|
328
|
+
fp : Path
|
329
|
+
The path to the downloaded DEM file.
|
330
|
+
"""
|
331
|
+
# check api key
|
332
|
+
if api_key is None:
|
333
|
+
print("No API key for OpenTopography was given or found in the keyring or environment variable.")
|
334
|
+
api_key = getpass("Please enter your API key for OpenTopography: ")
|
335
|
+
|
336
|
+
# make query
|
337
|
+
w, s, e, n = extent
|
338
|
+
url = f"https://portal.opentopography.org/API/globaldem?demtype=COP30&west={w}&south={s}&east={e}&north={n}&outputFormat=GTiff&API_Key={api_key}"
|
339
|
+
r = requests.get(url)
|
340
|
+
if r.status_code == 200:
|
341
|
+
# store api key
|
342
|
+
if api_key != keyring.get_password("weatherdb", "opentopo_api_key"):
|
343
|
+
keyring.set_password("weatherdb", "opentopo_api_key", api_key)
|
344
|
+
|
345
|
+
# get dem file
|
346
|
+
out_fp = out_dir / "OpenTopo_COP30.tif"
|
347
|
+
|
348
|
+
# check if file already exists
|
349
|
+
if not _check_write_fp(out_fp, overwrite):
|
350
|
+
return
|
351
|
+
|
352
|
+
# download file
|
353
|
+
with open(out_fp, "wb") as f:
|
354
|
+
for chunk in r.iter_content(chunk_size=1024):
|
355
|
+
f.write(chunk)
|
356
|
+
log.info(f"Downloaded DEM data from OpenTopography to '{out_fp}'.")
|
357
|
+
return out_fp
|
358
|
+
|
359
|
+
log.error(f"Request to openTopography API with url {r.url.replace(api_key, "[MASKED]")} returned status code {r.status_code}")
|
360
|
+
|
361
|
+
def download_dem(out_dir=None,
|
362
|
+
overwrite=None,
|
363
|
+
extent=(5.3, 46.1, 15.6, 55.4),
|
364
|
+
update_user_config=False,
|
365
|
+
service=["prism", "openTopography"], **kwargs):
|
366
|
+
"""Download the newest DEM data from the Copernicus Sentinel dataset.
|
367
|
+
|
368
|
+
Only the GLO-30 DEM, which has a 30m resolution, is downloaded as it is freely available.
|
369
|
+
If you register as a scientific researcher also the EEA-10, with 10 m resolution, is available.
|
370
|
+
You will have to download the data yourself and define it in the configuration file.
|
371
|
+
|
372
|
+
After downloading the data, the files are merged and saved as a single tif file in the data directory in a subfolder called 'DEM'.
|
373
|
+
To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the configuration file.
|
374
|
+
|
375
|
+
Source:
|
376
|
+
Copernicus DEM - Global and European Digital Elevation Model. Digital Surface Model (DSM) provided in 3 different resolutions (90m, 30m, 10m) with varying geographical extent (EEA: European and GLO: global) and varying format (INSPIRE, DGED, DTED). DOI:10.5270/ESA-c5d3d65.
|
377
|
+
|
378
|
+
Parameters
|
379
|
+
----------
|
380
|
+
out_dir : str or Path, optional
|
381
|
+
The directory to save the DEM data to.
|
382
|
+
If None the data is saved in the data directory in a subfolder called 'DEM'.
|
383
|
+
The default is None.
|
384
|
+
overwrite : bool, optional
|
385
|
+
Should the DEM data be downloaded even if it already exists?
|
386
|
+
If None the user will be asked.
|
387
|
+
The default is None.
|
388
|
+
extent : tuple, optional
|
389
|
+
The extent in WGS84 of the DEM data to download.
|
390
|
+
The default is the boundary of germany + ~40km = (5.3, 46.1, 15.6, 55.4).
|
391
|
+
update_user_config : bool, optional
|
392
|
+
Should the downloaded DEM be set as the used DEM in the user configuration file?
|
393
|
+
The default is False.
|
394
|
+
service : str or list of str, optional
|
395
|
+
The service to use to download the DEM data.
|
396
|
+
Options are "prism" and "openTopography".
|
397
|
+
If Both are given they are executed in the order they are given.
|
398
|
+
If OpenTopography is selected, you will have to provide an API key.
|
399
|
+
The default is ["prism", "openTopography"].
|
400
|
+
"""
|
401
|
+
# check service
|
402
|
+
if isinstance(service, str):
|
403
|
+
service = [service]
|
404
|
+
|
405
|
+
# check dir
|
406
|
+
if out_dir is None:
|
407
|
+
out_dir = Path(config.get("data", "base_dir")) / "DEM"
|
408
|
+
else:
|
409
|
+
out_dir = Path(out_dir)
|
410
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
411
|
+
|
412
|
+
# download data
|
413
|
+
fp=None
|
414
|
+
for s in service:
|
415
|
+
if s == "prism":
|
416
|
+
try:
|
417
|
+
fp = _download_dem_prism(
|
418
|
+
out_dir=out_dir,
|
419
|
+
overwrite=overwrite,
|
420
|
+
extent=extent,
|
421
|
+
**kwargs)
|
422
|
+
break
|
423
|
+
except Exception as e:
|
424
|
+
log.debug(f"Error while downloading DEM from PRISM: {e}")
|
425
|
+
elif s == "openTopography":
|
426
|
+
try:
|
427
|
+
fp = _download_dem_opentopo(
|
428
|
+
out_dir=out_dir,
|
429
|
+
overwrite=overwrite,
|
430
|
+
extent=extent,
|
431
|
+
**kwargs)
|
432
|
+
break
|
433
|
+
except Exception as e:
|
434
|
+
log.debug(f"Error while downloading DEM from OpenTopography: {e}")
|
435
|
+
|
436
|
+
# check if file was downloaded
|
437
|
+
if fp is None:
|
438
|
+
log.error("No DEM data was downloaded.")
|
439
|
+
return
|
276
440
|
|
277
441
|
# update user config
|
278
442
|
if update_user_config:
|
279
443
|
if config.has_user_config:
|
280
|
-
config.update_user_config("data:rasters", "dems", str(
|
444
|
+
config.update_user_config("data:rasters", "dems", str(fp))
|
281
445
|
return
|
282
446
|
else:
|
283
|
-
|
447
|
+
log.info("No user configuration file found, therefor the DEM is not set in the user configuration file.")
|
284
448
|
|
285
|
-
|
449
|
+
log.info("To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the user configuration file.")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: weatherdb
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.2
|
4
4
|
Summary: This is a package to work with and to create the Weather Database which handles, checks, fills and corrects DWD Weather Station data.
|
5
5
|
Author-email: Max Schmit <max.schmit@hydrology.uni-freiburg.de>
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
@@ -723,7 +723,7 @@ Author: [Max Schmit](https://github.com/maxschmi)
|
|
723
723
|
[![Documentation Status](https://readthedocs.org/projects/weatherdb/badge/?version=latest)](https://weatherdb.readthedocs.io/latest)
|
724
724
|
[![Pipeline status](https://gitlab.uni-freiburg.de/hydrology/weatherDB/badges/master/pipeline.svg?ignore_skipped=true)](https://gitlab.uni-freiburg.de/hydrology/weatherDB/-/pipelines)
|
725
725
|
|
726
|
-
The
|
726
|
+
The WeatherDB module offers an API to interact with the automatically filled weather Database.
|
727
727
|
|
728
728
|
Depending on the Database user privileges you can use more or less methods of the classes.
|
729
729
|
|
@@ -14,21 +14,21 @@ docs/source/_static/logo.png,sha256=6gg2g1aeGF_j5GOXR9i-4UjWZ-uEiqKidMENmFHKtNE,
|
|
14
14
|
docs/source/api/api.rst,sha256=kOiT9-3LGkYR6IJ2LwPaVfEclS5K_pBgbIxGrq09_Bg,251
|
15
15
|
docs/source/api/cli.rst,sha256=EzwCHyg0tK6284v_gWPWFogwhhnxlmUhYNcogWSWCu8,153
|
16
16
|
docs/source/api/weatherDB.broker.rst,sha256=ZkSN7ZB1BccWvJEtpg0-_zOPIUv0C3DVBYdWccwhdOY,119
|
17
|
-
docs/source/api/
|
18
|
-
docs/source/api/
|
19
|
-
docs/source/api/
|
20
|
-
docs/source/api/
|
21
|
-
docs/source/api/
|
22
|
-
docs/source/api/
|
17
|
+
docs/source/api/weatherdb.config.rst,sha256=ZXlRZZgxpihqI20adHzyYhHCRq1DItIJgDJrEgLVu4E,148
|
18
|
+
docs/source/api/weatherdb.db.rst,sha256=fWNfp0UEqLGy_rr6g2oJEt5rSvHaSdief1mm8X0RX-g,388
|
19
|
+
docs/source/api/weatherdb.rst,sha256=iECl8UDC1ekg-RhsyjLjUyoxr76DrRg5IzgalJMJcf8,320
|
20
|
+
docs/source/api/weatherdb.station.rst,sha256=57igu_OrWxTDCyN3pAGw-hOJRvM7dJi3PSePmBH6dps,1103
|
21
|
+
docs/source/api/weatherdb.stations.rst,sha256=ij3rBivaLTJ7VKAsNMdqCfQBnrupqZCIUoFzyI_wReE,879
|
22
|
+
docs/source/api/weatherdb.utils.rst,sha256=j4nbIiCxYFtBkzi-jGEiefW4uKYRtSM4xnJHP69mjyE,398
|
23
23
|
docs/source/setup/Configuration.md,sha256=qtJ-gvXmaVfp_ldBMv60YaKENtoGb-L5HHc7rb9MaZQ,4340
|
24
24
|
docs/source/setup/Hosting.md,sha256=4CUOgonpPhG-cPihrEsN3Z31rRKGWYeizg1QUhETmLw,105
|
25
25
|
docs/source/setup/Install.md,sha256=IdmycMBztQFs_FAqfiU1OxtN2ihGXfIqwW4KBnsG_Iw,1265
|
26
26
|
docs/source/setup/Quickstart.md,sha256=NmTvECVOS_uKoyWxgKtwQWHaH87gVFf1_QGGmZ97AZY,7062
|
27
27
|
docs/source/setup/setup.rst,sha256=bOmfcf-n9iivxbaBWk5t0nmiIc87bks_BMIJ1d6UHOM,258
|
28
28
|
weatherdb/__init__.py,sha256=2BzziScTYzA65WS6nhtCRZOWSLfwHTCwvZdeyuHw79U,846
|
29
|
-
weatherdb/_version.py,sha256=
|
29
|
+
weatherdb/_version.py,sha256=gtlfDPgq15HdgNzpLyxP5z-pg7TxLdIYeJw2QiTMNWs,21
|
30
30
|
weatherdb/broker.py,sha256=gA5zWq4RpTJxgvKIzo9Bc5ol3k8JxAZ1BKZGkYCcr80,24474
|
31
|
-
weatherdb/cli.py,sha256=
|
31
|
+
weatherdb/cli.py,sha256=jS_QNu4k2y7Q3d-iXTkdGP8qAEw2MWmE70wQdxBtqPo,10301
|
32
32
|
weatherdb/alembic/README.md,sha256=6hq24TPr8z3nqJCaqrmj6__kLikVG66kLGqfC_aFPWQ,440
|
33
33
|
weatherdb/alembic/alembic.ini,sha256=Mc3-qkQfA42ApX9douZT77g1pWE9gn4oMVJEDoebmdQ,3087
|
34
34
|
weatherdb/alembic/config.py,sha256=Q4aolMUUT7f6VmbY0uz_dWBtKkj3KgTUs_xOY_Gbzjw,264
|
@@ -47,8 +47,8 @@ weatherdb/db/models.py,sha256=6Oor07T1sAD6qEtoxwEcpmY1SkLVVONChXIIcTjbUk4,15242
|
|
47
47
|
weatherdb/db/views.py,sha256=DxY_IIonmiiRM-IhQrUMLwj12gIg6Q30rQAmR3wP3BE,6359
|
48
48
|
weatherdb/db/fixtures/RichterParameters.json,sha256=CKxrB5FBX_BRKqxegXNyNtn9DUKmgibUtdvHoE8E5JI,836
|
49
49
|
weatherdb/db/queries/get_quotient.py,sha256=9wVFmXE8tk8igGj-Xk5uSI0eiF_PQ9d-yRq7RJpvMAA,6787
|
50
|
-
weatherdb/station/GroupStation.py,sha256=
|
51
|
-
weatherdb/station/StationBases.py,sha256=
|
50
|
+
weatherdb/station/GroupStation.py,sha256=XAovs-zK5mZmJuvNJ3iCgpWH-1yWHL0axtygYu1mVi0,30292
|
51
|
+
weatherdb/station/StationBases.py,sha256=x0MlqHesPVQgijcThWBoIbgM7-_iJQLL86Teab-nlJc,125671
|
52
52
|
weatherdb/station/StationET.py,sha256=hM6K8fCLC6mOLaE4cN92LHOyPGP01ifO6l2qO77I_bA,3621
|
53
53
|
weatherdb/station/StationP.py,sha256=ENmWqEFwKR1WFsWmZ8-webEGTmrxODan8QO0gwIDDIU,32719
|
54
54
|
weatherdb/station/StationPD.py,sha256=Bcg_uQTgIQPffsMGhNEwKAXhYs1Ii4VeB75afdFG-Kk,3367
|
@@ -67,11 +67,11 @@ weatherdb/utils/TimestampPeriod.py,sha256=6whEr2FLoHC-ldpMg9wW27ELEse5RW6dvaZ84M
|
|
67
67
|
weatherdb/utils/__init__.py,sha256=siIvJT8lKLVvtdvWMpY3F9_h72Ky2d71DEdRGMWud5M,85
|
68
68
|
weatherdb/utils/dwd.py,sha256=amEVVPLzXTSScBP5VAK35dBxuiy-Ua4hHyKnDGxD_4Q,12394
|
69
69
|
weatherdb/utils/geometry.py,sha256=Od-RDAW1MASVAsGBXpHti9osbVJDqUbumSKBSJPbQqc,1823
|
70
|
-
weatherdb/utils/get_data.py,sha256=
|
70
|
+
weatherdb/utils/get_data.py,sha256=RyRQjgUjnRadGmpu88SKyxOwtkqw9f8qEDe7HJby4LY,16997
|
71
71
|
weatherdb/utils/logging.py,sha256=iaWnzCdBYxFmzWgLq9a6VAeBMdwy-rnt2d9PSAQq4lA,4242
|
72
|
-
weatherdb-1.1.
|
73
|
-
weatherdb-1.1.
|
74
|
-
weatherdb-1.1.
|
75
|
-
weatherdb-1.1.
|
76
|
-
weatherdb-1.1.
|
77
|
-
weatherdb-1.1.
|
72
|
+
weatherdb-1.1.2.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
|
73
|
+
weatherdb-1.1.2.dist-info/METADATA,sha256=nADh5aUQ2vFhvlFlN_uVWEIyBotUkXpp35KULolqCec,44266
|
74
|
+
weatherdb-1.1.2.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
|
75
|
+
weatherdb-1.1.2.dist-info/entry_points.txt,sha256=kJemTd9Cm_QWPZt03KUWhpn1aB0-l_5ce6Ms3EoS_NM,55
|
76
|
+
weatherdb-1.1.2.dist-info/top_level.txt,sha256=fI1xpTdDzn7NW-aRqQSj_VHgLvfN7wbK8Z1YXMx7ktM,22
|
77
|
+
weatherdb-1.1.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|