tfv-get-tools 0.2.1__py3-none-any.whl → 0.2.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -208,30 +208,23 @@ class BaseMerger(ABC):
208
208
  download_interval = self.cfg.get("_DOWNLOAD_INTERVAL", "monthly")
209
209
 
210
210
  if download_interval == "monthly":
211
- start_time_strings = [x.stem.split("_")[-2] for x in file_list]
212
- end_time_strings = [x.stem.split("_")[-1] for x in file_list]
211
+ time_stings = [re.search(r'_(\d{8})_(\d{8})', x.stem) for x in file_list]
212
+ start_time_strings = [x.group(1) for x in time_stings]
213
+ end_time_strings = [x.group(2) for x in time_stings]
214
+
213
215
  start_times = pd.DatetimeIndex(
214
- [pd.Timestamp(x, unit="h") for x in start_time_strings]
216
+ [pd.to_datetime(x, format="%Y%m%d") for x in start_time_strings]
215
217
  )
216
218
  end_times = pd.DatetimeIndex(
217
- [pd.Timestamp(x, unit="h") for x in end_time_strings]
219
+ [pd.to_datetime(x, format="%Y%m%d") for x in end_time_strings]
218
220
  )
219
221
 
220
222
  elif download_interval == "daily":
221
- start_time_strings = [x.stem.split("_")[-1] for x in file_list]
222
-
223
- # Handle legacy HYCOM files
224
- if start_time_strings and start_time_strings[0] == "0000":
225
- if self.verbose:
226
- print("WARNING: Detected legacy HYCOM files with time suffixes")
227
- start_time_strings = [
228
- x.name.split(".")[0].split("_")[-2] for x in file_list
229
- ]
230
-
223
+ start_time_strings = [re.search(r'_(\d{8})_', x.stem).group(1) for x in file_list]
231
224
  start_times = pd.DatetimeIndex(
232
- [pd.Timestamp(x, unit="h") for x in start_time_strings]
225
+ [pd.to_datetime(x, format="%Y%m%d") for x in start_time_strings]
233
226
  )
234
- end_times = start_times + pd.Timedelta("23.9h")
227
+ end_times = start_times + pd.Timedelta("23.99h")
235
228
  else:
236
229
  raise ValueError(f"Unknown download interval: {download_interval}")
237
230
 
@@ -516,7 +516,7 @@ class MergeHYCOM(BaseMerger):
516
516
 
517
517
  if time_vars:
518
518
  # Create single rolling object and apply to all variables
519
- rolling_ds = ds[time_vars].rolling(time=25, center=True).reduce(np.nanmean)
519
+ rolling_ds = ds[time_vars].rolling(time=25, center=True, min_periods=1).reduce(np.nanmean)
520
520
 
521
521
  for var_name in time_vars:
522
522
  # Only replace post-cutoff values
@@ -572,10 +572,10 @@ class MergeHYCOM(BaseMerger):
572
572
  if all_datasets and self._check_sub_daily_data(all_datasets[0]):
573
573
  apply_tidal_filtering = True
574
574
 
575
- if self.verbose:
576
- print("Concatenating and interpolating xarray dataset")
577
- if has_post_cutoff_data and apply_tidal_filtering:
578
- print('... Dataset contains sub-daily data post-2024-08-10 (HYCOM ESPC-D-V02), applying tidal filtering.')
575
+ print("Concatenating and interpolating xarray dataset")
576
+ if has_post_cutoff_data and apply_tidal_filtering:
577
+ print('... Dataset contains sub-daily data post-2024-08-10 (HYCOM ESPC-D-V02), applying tidal filtering using a simple 25h rolling mean.')
578
+ print('... Warning: Your dataset should be padded at least 1 full day either side before using in TUFLOW FV.')
579
579
 
580
580
  # Merge variables for each start date group
581
581
  merged_by_date = []
@@ -600,7 +600,13 @@ class MergeHYCOM(BaseMerger):
600
600
 
601
601
  # Apply tidal filtering to the merged dataset if needed
602
602
  if apply_tidal_filtering:
603
+ # Copy the original surface elevation data to a raw variable for later
604
+ raw_surf_el = merged['surf_el'].copy()
603
605
  merged = self._apply_tidal_filtering(merged)
606
+
607
+ # Copy original surface elevation
608
+ merged['raw_surf_el'] = raw_surf_el
609
+ merged['raw_surf_el'].attrs['note'] = 'Original HYCOM water-level containing tides after 2024-08-10'
604
610
 
605
611
  # Final cleanup
606
612
  merged = merged.rename({'lon': 'longitude', 'lat': 'latitude'})
@@ -99,13 +99,19 @@ class DownloadERA5Wave(BaseDownloader):
99
99
  print("You can find your key at: https://cds.climate.copernicus.eu/user/")
100
100
  print("="*60)
101
101
 
102
+ elif "cds-beta.climate.copernicus.eu" in error_msg:
103
+ print("\n" + "="*60)
104
+ print("CDS API AUTHENTICATION ERROR")
105
+ print("="*60)
106
+ print("Your CDS API key appears to be invalid.")
107
+ print("This is likely due to an update by the Copernicus Climate Data Store.")
108
+ print("Please check your .cdsapirc file and ensure your API key is correct.")
109
+ print("You can find your key at: https://cds.climate.copernicus.eu/user/")
110
+ print("="*60)
111
+
102
112
  else:
103
- # For any other errors, show the original message if verbose
104
- if self.verbose:
105
- print(f"Failed to download via CDS API: {e}")
106
- else:
107
- # Always show some info for unhandled errors
108
- print(f"\nCDS API Error: {e}")
113
+ print(f"Failed to download via CDS API: {e}")
114
+
109
115
 
110
116
  return False
111
117
 
@@ -141,7 +147,7 @@ class DownloadERA5Wave(BaseDownloader):
141
147
  raise ValueError("No NetCDF files found in zip archive")
142
148
 
143
149
  # Combine all datasets
144
- ds = xr.merge(datasets)
150
+ ds = xr.merge(datasets, compat='override')
145
151
  ds.to_netcdf(file_path_out)
146
152
 
147
153
  # Delete the zip file
@@ -229,4 +235,4 @@ class MergeERA5Wave(BaseMerger):
229
235
  if 'latitude' in merged.coords:
230
236
  merged = merged.sortby("latitude")
231
237
 
232
- return merged, skipped_files
238
+ return merged, skipped_files
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tfv_get_tools
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: Tool for downloading and processing data for TUFLOW FV modelling
5
5
  Author-email: Alex Waterhouse <alex.waterhouse@apac.bmt.org>, Mitchell Smith <mitchell.smith@apac.bmt.org>, TUFLOW Support <support@tuflow.com>
6
6
  License: MIT
@@ -60,22 +60,22 @@ TFV Get Tools is a Python package that simplifies the process of downloading and
60
60
  ### Supported Data Sources
61
61
 
62
62
  **Atmospheric Data:**
63
- - [ECMWF ERA5](https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5) (Default - registration required, see [CDS API](https://cds.climate.copernicus.eu/api-how-to))
63
+ - [ECMWF ERA5](https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5) (*Atmos Default* - registration required, see [CDS API](https://cds.climate.copernicus.eu/api-how-to))
64
64
  - [NOAA CFSR](https://www.ncei.noaa.gov/data/climate-forecast-system/) (Climate Forecast System Reanalysis)
65
65
  - [BARRA2](http://www.bom.gov.au/research/projects/reanalysis/) (Australian Bureau of Meteorology)
66
66
 
67
67
  **Ocean Data:**
68
- - [HYCOM](https://www.hycom.org/) (Naval Research Laboratory - Global Ocean Forecast System)
68
+ - [HYCOM](https://www.hycom.org/) (*Ocean Default* Naval Research Laboratory - Global Ocean Forecast System)
69
69
  - [Copernicus Marine](https://marine.copernicus.eu/) Global and NWS (registration required, see [Copernicus Marine Service](https://marine.copernicus.eu/))
70
70
 
71
71
  **Wave Data:**
72
- - [CSIRO CAWCR](https://data.csiro.au/collection/csiro:39819) (glob_24m, aus_10m, aus_4m, pac_10m, pac_4m)
72
+ - [CSIRO CAWCR](https://data.csiro.au/collection/csiro:39819) (*Wave Default* glob_24m, aus_10m, aus_4m, pac_10m, pac_4m)
73
73
  - [Copernicus Marine](https://marine.copernicus.eu/) Global and NWS
74
74
  - [ECMWF ERA5](https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5) (registration required, see [CDS API](https://cds.climate.copernicus.eu/api-how-to))
75
75
 
76
76
  **Tidal Data:**
77
77
  - [FES2014](https://www.aviso.altimetry.fr/en/data/products/auxiliary-products/global-tide-fes.html) (AVISO+ Finite Element Solution 2014)
78
- - [FES2022](https://www.aviso.altimetry.fr/en/data/products/auxiliary-products/global-tide-fes.html) (AVISO+ Finite Element Solution 2022)
78
+ - [FES2022](https://www.aviso.altimetry.fr/en/data/products/auxiliary-products/global-tide-fes.html) (*Tide Default* AVISO+ Finite Element Solution 2022)
79
79
 
80
80
  ## Installation
81
81
 
@@ -276,7 +276,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
276
276
 
277
277
  ## Authors
278
278
 
279
- Developed by [BMT](https://www.tuflow.com/), 2025
279
+ Developed by [TUFLOW](https://www.tuflow.com/), 2025
280
280
 
281
281
  ## Project Status
282
282
 
@@ -16,7 +16,7 @@ tfv_get_tools/fvc/_tide.py,sha256=tjs4GTg4NRIa7cFcBNFqMqo-yMzOZ6BKgdixSWZafTo,63
16
16
  tfv_get_tools/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  tfv_get_tools/providers/_custom_conversions.py,sha256=0w9wUkq2k4yireErfLwKKRaj6RkWDC_Cash7raqrGho,927
18
18
  tfv_get_tools/providers/_downloader.py,sha256=zLwYSweTKYJ_OmtikwzEQRw1s8Rc4Ma1aCIqY1jIxXM,19786
19
- tfv_get_tools/providers/_merger.py,sha256=g4-_6ft9gGwBinqzuKm3zMvk8wztvwDiStb45zj_TgQ,18602
19
+ tfv_get_tools/providers/_merger.py,sha256=gj6NkEsdx2QIUT8QmhaOzEXaFKEjpqBEmf_g2qaufzo,18367
20
20
  tfv_get_tools/providers/_utilities.py,sha256=8JiiadD8OGsMjZhGn8ce8s7vqtYZpDB-oQFieGAvKeA,7873
21
21
  tfv_get_tools/providers/atmos/barra2.py,sha256=8k_NJdlHwNgc2FMElabWaycuAdJBRARGc9QfzzDxQXc,6820
22
22
  tfv_get_tools/providers/atmos/cfsr.py,sha256=Cf_6mCBiPi1SCUd3NDX_psmDdITU1lqwqf5vNhj7ttY,8055
@@ -29,14 +29,14 @@ tfv_get_tools/providers/atmos/cfgs/cfsr.yaml,sha256=8HgskImaZHoW7Xm6rP5RgpFdTK_q
29
29
  tfv_get_tools/providers/atmos/cfgs/era5.yaml,sha256=_a34TT3CUWNGvtKHFVbNFS2_0YFZKQU1Sqnu3TC9fwg,1654
30
30
  tfv_get_tools/providers/atmos/cfgs/era5_gcp.yaml,sha256=CY-y4Uxq3fPFKtqCcsJcL0_j6Vu-hahNqK8HsTGS3Bc,1719
31
31
  tfv_get_tools/providers/ocean/copernicus_ocean.py,sha256=hPnxONvQ3YEAI65pG0KMaGImqu2POBYvW7-Q6xhjf3s,17848
32
- tfv_get_tools/providers/ocean/hycom.py,sha256=5_NOiMS37Amk-98avQHHHir_9TMuLnpkh8YnfNapheI,26334
32
+ tfv_get_tools/providers/ocean/hycom.py,sha256=fqIJGDVAwNB6A5k4Tu18mQs5BxwWkaeECOqYknOr5LI,26809
33
33
  tfv_get_tools/providers/ocean/cfgs/copernicus_blk.yaml,sha256=XGCj8_rDLNHSq6kQnvgjrahcPGaiLInxqB_9LoMvlAY,1482
34
34
  tfv_get_tools/providers/ocean/cfgs/copernicus_glo.yaml,sha256=IMETXv3u783YzxB3fRF_uQ5hYBN28aHAH3iJzXcuDhU,1443
35
35
  tfv_get_tools/providers/ocean/cfgs/copernicus_nws.yaml,sha256=rQhSEynvKgypohDhyIqizjZDriETbBiZPBtDp8dFLOY,1346
36
36
  tfv_get_tools/providers/ocean/cfgs/hycom.yaml,sha256=GQoEcyLYmF_PRPXeY2IO7jiqFcZad7y8bzPjsBn9PS4,1599
37
37
  tfv_get_tools/providers/wave/cawcr.py,sha256=95YZCewImgtldiDj6qJ6lkcIo_QIz2rFTYDB0qwkwVk,6028
38
38
  tfv_get_tools/providers/wave/copernicus_wave.py,sha256=FeoJUSDMH_tuo29VoZYSDXalra-lcfm9Mue--fJ-E7U,1031
39
- tfv_get_tools/providers/wave/era5.py,sha256=Re_auemuSl0dX-uW44VD86DwqiGAoE9YUja356XWJ5I,8860
39
+ tfv_get_tools/providers/wave/era5.py,sha256=4e1l_h5aZR-1LlvajDVAqG8jsEk8qdXHSm_NHK8wsA4,9190
40
40
  tfv_get_tools/providers/wave/era5_gcp.py,sha256=hLY_4YqQxhQ-P9uPC30Knv_LJ4vFMu1ZJJbGccR4xb8,6165
41
41
  tfv_get_tools/providers/wave/cfgs/cawcr_aus_10m.yaml,sha256=PCk6fkYHTD1uMv1oZP_7M4BuFWMxLaUdZmbbrJ4zA4w,936
42
42
  tfv_get_tools/providers/wave/cfgs/cawcr_aus_4m.yaml,sha256=LJ-8C8PFzVO4nmIMM4CUfhHsnnb1cTdKeYRr_DLIFKI,935
@@ -55,9 +55,9 @@ tfv_get_tools/utilities/horizontal_padding.py,sha256=-bqLDzqm17fOZqYrjJPXYwdVYwo
55
55
  tfv_get_tools/utilities/land_masking.py,sha256=19r9iiMMqxXChGlfmmXPzEM5VyhsnR-nqTsSjaKzP34,2743
56
56
  tfv_get_tools/utilities/parsers.py,sha256=V4ZBcpLPtSbkM3k5XoZS_xpauJVEzHUs9woNHznbHI4,1284
57
57
  tfv_get_tools/utilities/warnings.py,sha256=GWrj7Jh2gU3b9u2kzSfaqYPk8cL9aeMbkJgspn0a9W8,1146
58
- tfv_get_tools-0.2.1.dist-info/licenses/LICENSE,sha256=ALmu4D6vRZ-Xxz6IjzUIc_XyZGfVIWCOxIA1qe3tnVY,1059
59
- tfv_get_tools-0.2.1.dist-info/METADATA,sha256=MnaW1EVKw9rGj7ZxwpHFhG7fb79XTY4T4TmrxfvhjNs,10644
60
- tfv_get_tools-0.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
61
- tfv_get_tools-0.2.1.dist-info/entry_points.txt,sha256=pTCS55WUArvFH-Z_EsjTpICz9p1rqqVJ10e7aX3S2MA,194
62
- tfv_get_tools-0.2.1.dist-info/top_level.txt,sha256=K_ewT8V9jhtf59kUDU5YqahUczoInqs7ZFlc4Ho3IjE,14
63
- tfv_get_tools-0.2.1.dist-info/RECORD,,
58
+ tfv_get_tools-0.2.3.dist-info/licenses/LICENSE,sha256=ALmu4D6vRZ-Xxz6IjzUIc_XyZGfVIWCOxIA1qe3tnVY,1059
59
+ tfv_get_tools-0.2.3.dist-info/METADATA,sha256=zFKMXpqxji-rnrPIctOMJR46rklDLVVPb5AX8YSxB7k,10701
60
+ tfv_get_tools-0.2.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
61
+ tfv_get_tools-0.2.3.dist-info/entry_points.txt,sha256=pTCS55WUArvFH-Z_EsjTpICz9p1rqqVJ10e7aX3S2MA,194
62
+ tfv_get_tools-0.2.3.dist-info/top_level.txt,sha256=K_ewT8V9jhtf59kUDU5YqahUczoInqs7ZFlc4Ho3IjE,14
63
+ tfv_get_tools-0.2.3.dist-info/RECORD,,