From a93e47896585a85f2b667cec682e1f38e2fd0e71 Mon Sep 17 00:00:00 2001 From: mhidas Date: Mon, 30 May 2022 15:16:39 +1000 Subject: [PATCH 01/25] fix MultiIndex issue for ADCP files and update unittest to include this case fixes #159 --- aodntools/timeseries_products/hourly_timeseries.py | 2 ++ .../timeseries_products/test_hourly_timeseries.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/aodntools/timeseries_products/hourly_timeseries.py b/aodntools/timeseries_products/hourly_timeseries.py index 66e5292..7f5d7f1 100644 --- a/aodntools/timeseries_products/hourly_timeseries.py +++ b/aodntools/timeseries_products/hourly_timeseries.py @@ -414,6 +414,8 @@ def hourly_aggregator(files_to_aggregate, site_code, qcflags, input_dir='', outp nc_clean['TIME'] = nc_clean.indexes['TIME'].to_datetimeindex() df_temp = nc_clean.to_dataframe() + ## keep TIME as the only index (for ADCP files it would be a MultiIndex at this point) + df_temp = df_temp.reset_index().set_index('TIME') df_temp = df_temp[parameter_names] df_temp = PDresample_by_hour(df_temp, function_dict, function_stats) # do the magic diff --git a/test_aodntools/timeseries_products/test_hourly_timeseries.py b/test_aodntools/timeseries_products/test_hourly_timeseries.py index 07ad35b..bbc1d94 100644 --- a/test_aodntools/timeseries_products/test_hourly_timeseries.py +++ b/test_aodntools/timeseries_products/test_hourly_timeseries.py @@ -117,6 +117,19 @@ def test_hourly_aggregator_with_nonqc(self): for f in chartostring(dataset['source_file'][:]): self.assertIn(f, INPUT_FILES) + def test_with_adcp(self): + # Replace the BAD_FILE with an ADCP file - aggregation should work (only takes TEMP from the ADCP) + input_files = INPUT_FILES[:2] + \ + ['IMOS_ANMN-NRS_AETVZ_20180816T080000Z_NRSROT-ADCP_FV01_NRSROT-ADCP-1808-Sentinel-or-Monitor-Workhorse-ADCP-44_END-20180822T053000Z_C-20200623T000000Z.nc'] + output_file, bad_files = hourly_aggregator(files_to_aggregate=input_files, + site_code='NRSROT', + qcflags=(1, 2), + input_dir=TEST_ROOT, + output_dir='/tmp' + ) + + self.assertEqual(0, len(bad_files)) + def test_all_rejected(self): self.assertRaises(NoInputFilesError, hourly_aggregator, [BAD_FILE], 'NRSROT', (1, 2), input_dir=TEST_ROOT) From 3e393e0f0d139ccc6b5b3f890e38ca666985599f Mon Sep 17 00:00:00 2001 From: mhidas Date: Tue, 31 May 2022 16:18:12 +1000 Subject: [PATCH 02/25] fix ValueError in velocity_hourly_timeseries and update unittest to include this case fixes #124 --- .../velocity_hourly_timeseries.py | 2 +- .../IMOS_ANMN-NRS_ADCP_LAT_LON_DIMS.nc | Bin 0 -> 86972 bytes .../IMOS_ANMN-NRS_ADCP_SINGLE_TIMESTAMP.nc | Bin 0 -> 106434 bytes .../test_velocity_hourly_timeseries.py | 10 ++++++++++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test_aodntools/timeseries_products/IMOS_ANMN-NRS_ADCP_LAT_LON_DIMS.nc create mode 100644 test_aodntools/timeseries_products/IMOS_ANMN-NRS_ADCP_SINGLE_TIMESTAMP.nc diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries.py b/aodntools/timeseries_products/velocity_hourly_timeseries.py index 35cc60f..c13272e 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries.py +++ b/aodntools/timeseries_products/velocity_hourly_timeseries.py @@ -54,7 +54,7 @@ def append_resampled_values(nc_cell, ds, slice_start, binning_functions): :param binning_functions: list of numpy function names for binning :return: end index of the slice """ - df_cell = nc_cell.squeeze().to_dataframe() + df_cell = nc_cell.to_dataframe().reset_index().set_index('TIME') # shift the index forward 30min to centre the bins on the hour df_cell.index = df_cell.index + pd.Timedelta(minutes=30) diff --git a/test_aodntools/timeseries_products/IMOS_ANMN-NRS_ADCP_LAT_LON_DIMS.nc b/test_aodntools/timeseries_products/IMOS_ANMN-NRS_ADCP_LAT_LON_DIMS.nc new file mode 100644 index 0000000000000000000000000000000000000000..057873738eb2e1526956d169a1a81440677d150f GIT binary patch literal 86972 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ⅆ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 cV}Nswh($ literal 0 HcmV?d00001 diff --git a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py index 5f734b7..9c3ee4c 100644 --- a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py +++ b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py @@ -75,6 +75,16 @@ def test_all_rejected(self): self.assertRaises(NoInputFilesError, velocity_hourly_aggregated, [BAD_FILE], 'NRSROT', input_dir=TEST_ROOT, output_dir='/tmp') + def test_size1_dimensions(self): + input_files = [ + 'IMOS_ANMN-NRS_ADCP_LAT_LON_DIMS.nc', + 'IMOS_ANMN-NRS_ADCP_SINGLE_TIMESTAMP.nc' + ] + output_file, bad_files = velocity_hourly_aggregated(input_files, 'NRSROT', + input_dir=TEST_ROOT, output_dir='/tmp') + + self.assertEqual(0, len(bad_files)) + if __name__ == '__main__': unittest.main() From 9dfcc61fbc54f8fa3725016b70669e5caf7b06c4 Mon Sep 17 00:00:00 2001 From: mhidas Date: Mon, 6 Jun 2022 17:34:14 +1000 Subject: [PATCH 03/25] Fix command-line arg for hourly_aggregator Fixes #135 --- aodntools/timeseries_products/hourly_timeseries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aodntools/timeseries_products/hourly_timeseries.py b/aodntools/timeseries_products/hourly_timeseries.py index 7f5d7f1..a24a648 100644 --- a/aodntools/timeseries_products/hourly_timeseries.py +++ b/aodntools/timeseries_products/hourly_timeseries.py @@ -567,4 +567,4 @@ def hourly_aggregator(files_to_aggregate, site_code, qcflags, input_dir='', outp qcflags = [int(i) for i in args.qcflags] hourly_aggregator(files_to_aggregate=files_to_aggregate, site_code=args.site_code, qcflags=qcflags, - input_dir=args.input_dir, output_dir=args.output_path) + input_dir=args.input_dir, output_dir=args.output_dir) From ef75f709d20f31b02c1c8c2aae2ec6a4a172bb99 Mon Sep 17 00:00:00 2001 From: mhidas Date: Mon, 6 Jun 2022 17:46:16 +1000 Subject: [PATCH 04/25] Update author and author_email attributes Fixes #122 --- .../timeseries_products/aggregated_timeseries_template.json | 4 ++-- .../timeseries_products/gridded_timeseries_template.json | 4 ++-- aodntools/timeseries_products/hourly_timeseries_template.json | 4 ++-- .../velocity_aggregated_timeseries_template.json | 4 ++-- .../velocity_hourly_timeseries_template.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/aodntools/timeseries_products/aggregated_timeseries_template.json b/aodntools/timeseries_products/aggregated_timeseries_template.json index 6c34061..3130f2a 100644 --- a/aodntools/timeseries_products/aggregated_timeseries_template.json +++ b/aodntools/timeseries_products/aggregated_timeseries_template.json @@ -289,8 +289,8 @@ "_global":{ "abstract": "Aggregated Time-series Product: This file contains all measurements of the selected variable from all instruments deployed at the selected site. Timestamps are chronologically ordered, but may not be at uniform intervals. Instrument details are stored as a variable in order to keep a record of the origin of each measurement. The quality control flags of the variable of interest and DEPTH are preserved. Out-of-water measurements have been excluded, but no other filtering has been applied to the input data.", "acknowledgement": "Any users of IMOS data are required to clearly acknowledge the source of the material derived from IMOS in the format: \"Data was sourced from the Integrated Marine Observing System (IMOS) - IMOS is a national collaborative research infrastructure, supported by the Australian Government.\" If relevant, also credit other organisations involved in collection of this particular datastream (as listed in 'credit' in the metadata record).", - "author": "Klein, Eduardo", - "author_email": "eduardo.kleinsalas@utas.edu.au", + "author": "Australian Ocean Data Network (AODN)", + "author_email": "info@aodn.org.au", "citation": "The citation in a list of references is: \"IMOS [year-of-data-download], [Title], [data-access-URL], accessed [date-of-access].\".", "Conventions": "CF-1.6,IMOS-1.4", "data_centre": "Australian Ocean Data Network (AODN)", diff --git a/aodntools/timeseries_products/gridded_timeseries_template.json b/aodntools/timeseries_products/gridded_timeseries_template.json index 784e226..42601f0 100644 --- a/aodntools/timeseries_products/gridded_timeseries_template.json +++ b/aodntools/timeseries_products/gridded_timeseries_template.json @@ -77,8 +77,8 @@ "title": "Gridded Time Series Product: {VoI} interpolated at {site_code} to fixed target depths at 1-hour time intervals, between {time_min} and {time_max} and {depth_min} and {depth_max} meters.", "abstract": "Gridded Time Series Product: This file contains {VoI} readings from all instruments deployed at the {site_code} mooring site. The source of the values is the Hourly Time Series Product where TIME is fixed to 1-hour interval. The variable values are interpolated to a fixed target depths using a linear interpolation between consecutive existing depths. Only values flagged as 1 or 2 are used in the interpolation.", "acknowledgement": "Any users of IMOS data are required to clearly acknowledge the source of the material derived from IMOS in the format: \"Data was sourced from the Integrated Marine Observing System (IMOS) - IMOS is a national collaborative research infrastructure, supported by the Australian Government.\" If relevant, also credit other organisations involved in collection of this particular datastream (as listed in 'credit' in the metadata record).", - "author": "Klein, Eduardo", - "author_email": "eduardo.kleinsalas@utas.edu.au", + "author": "Australian Ocean Data Network (AODN)", + "author_email": "info@aodn.org.au", "citation": "The citation in a list of references is: \"IMOS [year-of-data-download], [Title], [data-access-URL], accessed [date-of-access].\".", "Conventions": "CF-1.6,IMOS-1.4", "data_centre": "Australian Ocean Data Network (AODN)", diff --git a/aodntools/timeseries_products/hourly_timeseries_template.json b/aodntools/timeseries_products/hourly_timeseries_template.json index 2d3aa0f..ae5c99f 100644 --- a/aodntools/timeseries_products/hourly_timeseries_template.json +++ b/aodntools/timeseries_products/hourly_timeseries_template.json @@ -368,8 +368,8 @@ "_global":{ "abstract": "Hourly Time Series Product: This file contains selected variables from all instruments deployed at the {site_code} mooring site. The values are binned to a fixed 1-hour interval. Instrument details are stored as variables in order to keep a record of the origin of each measurement. Out-of-water measurements have been excluded. Only values flagged as {flags} are retained in the aggregation.", "acknowledgement": "Any users of IMOS data are required to clearly acknowledge the source of the material derived from IMOS in the format: \"Data was sourced from the Integrated Marine Observing System (IMOS) - IMOS is a national collaborative research infrastructure, supported by the Australian Government.\" If relevant, also credit other organisations involved in collection of this particular datastream (as listed in 'credit' in the metadata record).", - "author": "Klein, Eduardo", - "author_email": "eduardo.kleinsalas@utas.edu.au", + "author": "Australian Ocean Data Network (AODN)", + "author_email": "info@aodn.org.au", "citation": "The citation in a list of references is: \"IMOS [year-of-data-download], [Title], [data-access-URL], accessed [date-of-access].\".", "Conventions": "CF-1.6,IMOS-1.4", "data_centre": "Australian Ocean Data Network (AODN)", diff --git a/aodntools/timeseries_products/velocity_aggregated_timeseries_template.json b/aodntools/timeseries_products/velocity_aggregated_timeseries_template.json index 7ef5fc5..eb87a20 100644 --- a/aodntools/timeseries_products/velocity_aggregated_timeseries_template.json +++ b/aodntools/timeseries_products/velocity_aggregated_timeseries_template.json @@ -153,8 +153,8 @@ "_global":{ "abstract": "Velocity Aggregated Time-series Product: This file contains all measurements of UCUR, VCUR and WCUR from all instruments deployed at the selected site. Timestamps are chronologically ordered, but may not be at uniform intervals. Measurements are referenced to its absolute DEPTH. Instrument details are stored as a variable in order to keep a record of the origin of each measurement. The quality control flags of the variable of interest and DEPTH are preserved. Out-of-water measurements have been excluded, but no other filtering has been applied to the input data.", "acknowledgement": "Any users of IMOS data are required to clearly acknowledge the source of the material derived from IMOS in the format: \"Data was sourced from the Integrated Marine Observing System (IMOS) - IMOS is a national collaborative research infrastructure, supported by the Australian Government.\" If relevant, also credit other organisations involved in collection of this particular datastream (as listed in 'credit' in the metadata record).", - "author": "Klein, Eduardo", - "author_email": "eduardo.kleinsalas@utas.edu.au", + "author": "Australian Ocean Data Network (AODN)", + "author_email": "info@aodn.org.au", "citation": "The citation in a list of references is: \"IMOS [year-of-data-download], [Title], [data-access-URL], accessed [date-of-access].\".", "Conventions": "CF-1.6,IMOS-1.4", "data_centre": "Australian Ocean Data Network (AODN)", diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries_template.json b/aodntools/timeseries_products/velocity_hourly_timeseries_template.json index 37c47e0..700bae2 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries_template.json +++ b/aodntools/timeseries_products/velocity_hourly_timeseries_template.json @@ -195,7 +195,7 @@ "_global":{ "abstract": "Hourly Time-series Product: This file contains all measurements of quality-controlled U, V and W sea water velocity variables from all instruments deployed at the selected site, binned into 1-hour time intervals. Out-of-water measurements, and those flagged as bad by IMOS standard automated quality-control procedures, have been excluded. Timestamps in the input files indicate the start of each measurement interval (up to an hour in duration), and these have not been shifted to the centre of the interval before binning. Instrument details are stored as variables in order to keep a record of the origin of each measurement.", "acknowledgement": "Any users of IMOS data are required to clearly acknowledge the source of the material derived from IMOS in the format: \"Data was sourced from the Integrated Marine Observing System (IMOS) - IMOS is a national collaborative research infrastructure, supported by the Australian Government.\" If relevant, also credit other organisations involved in collection of this particular datastream (as listed in 'credit' in the metadata record).", - "author": "Klein, Eduardo", + "author": "Australian Ocean Data Network (AODN)", "author_email": "info@aodn.org.au", "citation": "The citation in a list of references is: \"IMOS [year-of-data-download], [Title], [data-access-URL], accessed [date-of-access].\".", "comment": "Timestamps in the input files indicate the start of each measurement interval (instrument-dependent; up to an hour in duration), and these have not been shifted to the centre of the interval before binning. This could lead to an artificial shift of up to half an hour in the output data. The size of this shift, where known, has been recorded in the SECONDS_TO_MIDDLE variable.", From 0b6af2888da409bfd1f0f20813ba0cd7bcdf2cf3 Mon Sep 17 00:00:00 2001 From: mhidas Date: Wed, 8 Jun 2022 15:13:53 +1000 Subject: [PATCH 05/25] ensure missing values in aggregated variables are filled instead of set to NaN + update tests for aggregated_timeseries to check for these issues --- .../aggregated_timeseries.py | 16 +++++---- ...ted-timeseries_END-20190523_C-20220607.nc} | Bin 204061 -> 218151 bytes .../test_aggregated_timeseries.py | 31 ++++++++++++++---- 3 files changed, 33 insertions(+), 14 deletions(-) rename test_aodntools/timeseries_products/{IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20200622.nc => IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20220607.nc} (66%) diff --git a/aodntools/timeseries_products/aggregated_timeseries.py b/aodntools/timeseries_products/aggregated_timeseries.py index 2b63f6e..d82d01f 100644 --- a/aodntools/timeseries_products/aggregated_timeseries.py +++ b/aodntools/timeseries_products/aggregated_timeseries.py @@ -39,7 +39,7 @@ def get_variable_values(nc, variable): Get values of the variable and its QC flags. If variable is not present, nan returned, its QC flags set to 9 If variable present but not its QC flags, QC set to 0 - :param nc: dataset + :param nc: xarray dataset :param variable: name of the variable to get :return: variable values and variable qc flags """ @@ -48,6 +48,8 @@ def get_variable_values(nc, variable): if variable in file_variables: variable_values = nc[variable].values + if any(np.isnan(variable_values)): + variable_values = np.ma.masked_array(variable_values, mask=np.isnan(variable_values)) if variable+'_quality_control' in file_variables: variableQC_values = nc[variable+'_quality_control'].values else: @@ -317,12 +319,12 @@ def main_aggregator(files_to_agg, var_to_agg, site_code, input_dir='', output_di 'site_code': site_code, 'time_coverage_start': time_start, 'time_coverage_end': time_end, - 'geospatial_vertical_min': np.min(ds['DEPTH']), - 'geospatial_vertical_max': np.max(ds['DEPTH']), - 'geospatial_lat_min': np.min(ds['LATITUDE']), - 'geospatial_lat_max': np.max(ds['LATITUDE']), - 'geospatial_lon_min': np.min(ds['LONGITUDE']), - 'geospatial_lon_max': np.max(ds['LONGITUDE']), + 'geospatial_vertical_min': np.min(ds['DEPTH'][:]), + 'geospatial_vertical_max': np.max(ds['DEPTH'][:]), + 'geospatial_lat_min': np.min(ds['LATITUDE'][:]), + 'geospatial_lat_max': np.max(ds['LATITUDE'][:]), + 'geospatial_lon_min': np.min(ds['LONGITUDE'][:]), + 'geospatial_lon_max': np.max(ds['LONGITUDE'][:]), 'date_created': datetime.utcnow().strftime(timeformat), 'history': datetime.utcnow().strftime(timeformat) + ': Aggregated file created.', 'keywords': ', '.join([var_to_agg, 'AGGREGATED']), diff --git a/test_aodntools/timeseries_products/IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20200622.nc b/test_aodntools/timeseries_products/IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20220607.nc similarity index 66% rename from test_aodntools/timeseries_products/IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20200622.nc rename to test_aodntools/timeseries_products/IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20220607.nc index 5a1d4faa7ddfbcdbbd00c292ca971b39c6b110ad..32060f31d3a63c8aaf676182402d017c73da8e50 100644 GIT binary patch delta 61022 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 z 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 diff --git a/test_aodntools/timeseries_products/test_aggregated_timeseries.py b/test_aodntools/timeseries_products/test_aggregated_timeseries.py index 2055efd..0f4f74d 100644 --- a/test_aodntools/timeseries_products/test_aggregated_timeseries.py +++ b/test_aodntools/timeseries_products/test_aggregated_timeseries.py @@ -3,6 +3,7 @@ import os import unittest +import numpy as np from netCDF4 import Dataset, chartostring from aodntools import __version__ @@ -19,7 +20,7 @@ BAD_FILE ] EXPECTED_OUTPUT_FILE = os.path.join( - TEST_ROOT, 'IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20200622.nc' + TEST_ROOT, 'IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20220607.nc' ) @@ -69,13 +70,29 @@ def test_main_aggregator(self): self.assertIn(__version__, dataset.lineage) self.assertIn(BAD_FILE, dataset.rejected_files) - # check aggregated variable values + compare_attrs = ('Conventions', 'feature_type', 'author', 'author_email', 'file_version', + 'geospatial_lat_max', 'geospatial_lat_min', 'geospatial_lon_max', 'geospatial_lon_min', + 'geospatial_vertical_max', 'geospatial_vertical_min', 'naming_authority', 'project', + 'time_coverage_start', 'time_coverage_end' + ) expected = Dataset(EXPECTED_OUTPUT_FILE) - compare_vars = ('TIME', 'TEMP', 'TEMP_quality_control', 'NOMINAL_DEPTH', 'instrument_index') - non_match_vars = [var for var in compare_vars - if not all(dataset[var][:] == expected[var][:]) - ] - self.assertEqual(non_match_vars, []) + for attr in compare_attrs: + self.assertEqual(dataset.getncattr(attr), expected.getncattr(attr)) + + # check that there are no NaN values in any variable (they should be fill values instead) + nan_vars = [name + for name, var in dataset.variables.items() + if var.dtype in (np.dtype('float32'), np.dtype('float64')) and any(np.isnan(var[:])) + ] + self.assertEqual([], nan_vars) + + # check aggregated variable values + non_match_vars = [] + for var in set(expected.variables.keys()) - string_vars: + # compare the raw data arrays (not the masked_array) + if not all(dataset[var][:].data == expected[var][:].data): + non_match_vars.append(var) + self.assertEqual([], non_match_vars) def test_source_file_attributes(self): output_file, bad_files = main_aggregator(INPUT_FILES, 'PSAL', 'NRSROT', input_dir=TEST_ROOT, From c669d38e8089145bf3d4b3c540f98421c91b2912 Mon Sep 17 00:00:00 2001 From: mhidas Date: Wed, 8 Jun 2022 16:24:30 +1000 Subject: [PATCH 06/25] refactor comparison with expected file in timeseries_products unittests --- test_aodntools/base_test.py | 50 +++++++++++++++++++ .../test_aggregated_timeseries.py | 36 ++++--------- .../test_hourly_timeseries.py | 21 ++++---- .../test_velocity_aggregated_timeseries.py | 19 ++++--- .../test_velocity_hourly_timeseries.py | 19 +++---- 5 files changed, 85 insertions(+), 60 deletions(-) diff --git a/test_aodntools/base_test.py b/test_aodntools/base_test.py index f8d2901..eb8eaf9 100644 --- a/test_aodntools/base_test.py +++ b/test_aodntools/base_test.py @@ -2,8 +2,12 @@ import tempfile import unittest +import numpy as np +from netCDF4 import Dataset + class BaseTestCase(unittest.TestCase): + EXPECTED_OUTPUT_FILE = None @property def temp_dir(self): @@ -22,3 +26,49 @@ def temp_nc_file(self): def tearDown(self): if hasattr(self, '_temp_dir'): shutil.rmtree(self._temp_dir) + + def compare_global_attributes(self, dataset, + attrs = ('geospatial_lat_max', 'geospatial_lat_min', + 'geospatial_lon_max', 'geospatial_lon_min', + 'geospatial_vertical_max', 'geospatial_vertical_min', + 'time_coverage_start', 'time_coverage_end' + ) + ): + "Compare global attributes of the given dataset with those in self.EXPECTED_OUTPUT_FILE" + + not_matching = [] + with Dataset(self.EXPECTED_OUTPUT_FILE) as expected: + for attr in attrs: + if dataset.getncattr(attr) != expected.getncattr(attr): + not_matching.append((attr, + "expected: {exp}; found: {found}".format(exp=dataset.getncattr(attr), + found=dataset.getncattr(attr)) + )) + + self.assertEqual([], not_matching) + + def check_nan_values(self, dataset): + "check that there are no NaN values in any variable (they should be fill values instead)" + nan_vars = [(name, "contains NaN values") + for name, var in dataset.variables.items() + if var.dtype in (np.dtype('float32'), np.dtype('float64')) and any(np.isnan(var[:])) + ] + self.assertEqual([], nan_vars) + + def compare_variables(self, dataset, skip_vars=('source_file', 'instrument_id')): + """Compare dimensions and values of all variables in dataset with those in self.EXPECTED_OUTPUT_FILE, + except for variables listed in skip_vars. + """ + differences = [] + with Dataset(self.EXPECTED_OUTPUT_FILE) as expected: + for var in set(expected.variables.keys()) - set(skip_vars): + if not dataset[var].dimensions == expected[var].dimensions: + differences.append((var, "dimensions differ")) + if not dataset[var].shape == expected[var].shape: + differences.append((var, "shapes differ")) + + # compare the raw data arrays (not the masked_array) + if not all(dataset[var][:].data == expected[var][:].data): + differences.append((var, "variable values differ")) + + self.assertEqual([], differences) diff --git a/test_aodntools/timeseries_products/test_aggregated_timeseries.py b/test_aodntools/timeseries_products/test_aggregated_timeseries.py index 0f4f74d..6c7e325 100644 --- a/test_aodntools/timeseries_products/test_aggregated_timeseries.py +++ b/test_aodntools/timeseries_products/test_aggregated_timeseries.py @@ -3,7 +3,6 @@ import os import unittest -import numpy as np from netCDF4 import Dataset, chartostring from aodntools import __version__ @@ -19,12 +18,13 @@ 'IMOS_ANMN-NRS_BCKOSTUZ_20181213T080038Z_NRSROT_FV01_NRSROT-1812-WQM-55_END-20181215T013118Z_C-20190828T000000Z.nc', BAD_FILE ] -EXPECTED_OUTPUT_FILE = os.path.join( - TEST_ROOT, 'IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20220607.nc' -) class TestAggregatedTimeseries(BaseTestCase): + EXPECTED_OUTPUT_FILE = os.path.join( + TEST_ROOT, 'IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV01_TEMP-aggregated-timeseries_END-20190523_C-20220607.nc' + ) + def test_main_aggregator(self): output_file, bad_files = main_aggregator(INPUT_FILES, 'TEMP', 'NRSROT', input_dir=TEST_ROOT, output_dir='/tmp') @@ -70,29 +70,11 @@ def test_main_aggregator(self): self.assertIn(__version__, dataset.lineage) self.assertIn(BAD_FILE, dataset.rejected_files) - compare_attrs = ('Conventions', 'feature_type', 'author', 'author_email', 'file_version', - 'geospatial_lat_max', 'geospatial_lat_min', 'geospatial_lon_max', 'geospatial_lon_min', - 'geospatial_vertical_max', 'geospatial_vertical_min', 'naming_authority', 'project', - 'time_coverage_start', 'time_coverage_end' - ) - expected = Dataset(EXPECTED_OUTPUT_FILE) - for attr in compare_attrs: - self.assertEqual(dataset.getncattr(attr), expected.getncattr(attr)) - - # check that there are no NaN values in any variable (they should be fill values instead) - nan_vars = [name - for name, var in dataset.variables.items() - if var.dtype in (np.dtype('float32'), np.dtype('float64')) and any(np.isnan(var[:])) - ] - self.assertEqual([], nan_vars) - - # check aggregated variable values - non_match_vars = [] - for var in set(expected.variables.keys()) - string_vars: - # compare the raw data arrays (not the masked_array) - if not all(dataset[var][:].data == expected[var][:].data): - non_match_vars.append(var) - self.assertEqual([], non_match_vars) + self.compare_global_attributes(dataset) + + self.check_nan_values(dataset) + + self.compare_variables(dataset) def test_source_file_attributes(self): output_file, bad_files = main_aggregator(INPUT_FILES, 'PSAL', 'NRSROT', input_dir=TEST_ROOT, diff --git a/test_aodntools/timeseries_products/test_hourly_timeseries.py b/test_aodntools/timeseries_products/test_hourly_timeseries.py index bbc1d94..b2658af 100644 --- a/test_aodntools/timeseries_products/test_hourly_timeseries.py +++ b/test_aodntools/timeseries_products/test_hourly_timeseries.py @@ -20,9 +20,6 @@ BAD_FILE ] INPUT_PATHS = [os.path.join(TEST_ROOT, f) for f in INPUT_FILES] -EXPECTED_OUTPUT_FILE = os.path.join( - TEST_ROOT, 'IMOS_ANMN-NRS_STZ_20181213_NRSROT_FV02_hourly-timeseries_END-20190523_C-20220428.nc' -) INST_VARIABLES = {'instrument_id', 'source_file', 'LONGITUDE', 'LATITUDE', 'NOMINAL_DEPTH'} OBS_VARIABLES = {'instrument_index', 'TIME'} @@ -49,6 +46,10 @@ class TestHourlyTimeseries(BaseTestCase): + EXPECTED_OUTPUT_FILE = os.path.join( + TEST_ROOT, 'IMOS_ANMN-NRS_STZ_20181213_NRSROT_FV02_hourly-timeseries_END-20190523_C-20220428.nc' + ) + def test_hourly_aggregator(self): output_file, bad_files = hourly_aggregator(files_to_aggregate=INPUT_PATHS, site_code='NRSROT', @@ -87,15 +88,11 @@ def test_hourly_aggregator(self): self.assertIn('hourly_timeseries.py', dataset.lineage) self.assertIn(BAD_FILE, dataset.rejected_files) - # check variable values - expected = Dataset(EXPECTED_OUTPUT_FILE) - self.assertEqual(len(expected['TIME']), len(dataset['TIME'])) - compare_vars = ('TIME', 'NOMINAL_DEPTH', 'instrument_index', - 'TEMP', 'TEMP_count', 'TEMP_min', 'TEMP_max') - non_match_vars = [var for var in compare_vars - if not all(dataset[var][:] == expected[var][:]) - ] - self.assertEqual(non_match_vars, []) + self.compare_global_attributes(dataset) + + self.check_nan_values(dataset) + + self.compare_variables(dataset) def test_hourly_aggregator_with_nonqc(self): output_file, bad_files = hourly_aggregator(files_to_aggregate=INPUT_FILES, diff --git a/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py b/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py index 8001978..1e772fd 100644 --- a/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py +++ b/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py @@ -18,9 +18,6 @@ 'IMOS_ANMN-NRS_AETVZ_20191016T080000Z_NRSROT-ADCP_FV01_NRSROT-ADCP-1910-Sentinel-or-Monitor-Workhorse-ADCP-44_END-20191018T100000Z_C-20200430T000000Z.nc', BAD_FILE ] -EXPECTED_OUTPUT_FILE = os.path.join( - TEST_ROOT, 'IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV01_velocity-aggregated-timeseries_END-20191018_C-20200623.nc' -) OBS_VARS = {'TIME', 'DEPTH', 'DEPTH_quality_control', 'UCUR', 'UCUR_quality_control', 'VCUR', 'VCUR_quality_control', 'WCUR', 'WCUR_quality_control', 'instrument_index', 'CELL_INDEX'} @@ -29,6 +26,10 @@ class TestVelocityAggregatedTimeseries(BaseTestCase): + EXPECTED_OUTPUT_FILE = os.path.join( + TEST_ROOT, 'IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV01_velocity-aggregated-timeseries_END-20191018_C-20200623.nc' + ) + def test_velocity_aggregated(self): output_file, bad_files = velocity_aggregated(INPUT_FILES, 'NRSROT', input_dir=TEST_ROOT, output_dir='/tmp') @@ -56,13 +57,11 @@ def test_velocity_aggregated(self): self.assertEqual(__version__, dataset.generating_code_version) self.assertIn(__version__, dataset.lineage) - # check aggregated variable values - expected = Dataset(EXPECTED_OUTPUT_FILE) - compare_vars = set(expected.variables.keys()) - STR_VARS - non_match_vars = [var for var in compare_vars - if not all(dataset[var][:] == expected[var][:]) - ] - self.assertEqual(non_match_vars, []) + self.compare_global_attributes(dataset) + + self.check_nan_values(dataset) + + self.compare_variables(dataset) def test_all_rejected(self): self.assertRaises(NoInputFilesError, velocity_aggregated, [BAD_FILE], 'NRSROT', diff --git a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py index 9c3ee4c..7df05d6 100644 --- a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py +++ b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py @@ -19,9 +19,6 @@ 'IMOS_ANMN-NRS_AETVZ_20191016T080000Z_NRSROT-ADCP_FV01_NRSROT-ADCP-1910-Sentinel-or-Monitor-Workhorse-ADCP-44_END-20191018T100000Z_C-20200430T000000Z.nc', BAD_FILE ] -EXPECTED_OUTPUT_FILE = os.path.join( - TEST_ROOT, 'IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220502.nc' -) OBS_VARS = {'TIME', 'instrument_index', 'CELL_INDEX'} INST_VARS = {'LATITUDE', 'LONGITUDE', 'NOMINAL_DEPTH', 'SECONDS_TO_MIDDLE'} @@ -33,6 +30,10 @@ class TestVelocityHourlyTimeseries(BaseTestCase): + EXPECTED_OUTPUT_FILE = os.path.join( + TEST_ROOT, 'IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220502.nc' + ) + def test_velocity_hourly(self): output_file, bad_files = velocity_hourly_aggregated(INPUT_FILES, 'NRSROT', input_dir=TEST_ROOT, output_dir='/tmp') @@ -61,15 +62,11 @@ def test_velocity_hourly(self): self.assertEqual(__version__, dataset.generating_code_version) self.assertIn(__version__, dataset.lineage) - # check aggregated variable values - expected = Dataset(EXPECTED_OUTPUT_FILE) - self.assertEqual(len(expected['TIME']), len(dataset['TIME'])) + self.compare_global_attributes(dataset) + + self.check_nan_values(dataset) - non_match_vars = [] - for var in set(expected.variables.keys()) - STR_VARS: - if not all(np.isclose(dataset[var], expected[var], equal_nan=True)): - non_match_vars.append(var) - self.assertEqual(non_match_vars, []) + self.compare_variables(dataset) def test_all_rejected(self): self.assertRaises(NoInputFilesError, velocity_hourly_aggregated, [BAD_FILE], 'NRSROT', From 7bbbbe3cf3cc4725ab06781960235134b149e247 Mon Sep 17 00:00:00 2001 From: mhidas Date: Wed, 8 Jun 2022 16:52:26 +1000 Subject: [PATCH 07/25] fix NaN variable values in the remaining products (fixes #118) --- .../velocity_aggregated_timeseries.py | 2 +- .../velocity_hourly_timeseries.py | 19 +++++++++--------- ...END-20191018T100000Z_C-20200430T000000Z.nc | Bin 108070 -> 90723 bytes ...ated-timeseries_END-20191018_C-20200623.nc | Bin 141133 -> 141133 bytes ...rly-timeseries_END-20191018_C-20220608.nc} | Bin 238442 -> 244611 bytes .../test_hourly_timeseries.py | 2 ++ .../test_velocity_hourly_timeseries.py | 2 +- 7 files changed, 13 insertions(+), 12 deletions(-) rename test_aodntools/timeseries_products/{IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220502.nc => IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220608.nc} (69%) diff --git a/aodntools/timeseries_products/velocity_aggregated_timeseries.py b/aodntools/timeseries_products/velocity_aggregated_timeseries.py index e04c58b..450dc54 100644 --- a/aodntools/timeseries_products/velocity_aggregated_timeseries.py +++ b/aodntools/timeseries_products/velocity_aggregated_timeseries.py @@ -144,7 +144,7 @@ def velocity_aggregated(files_to_agg, site_code, input_dir='', output_dir='./', WCUR[start:end] = flat_variable(nc, 'WCUR') WCURqc[start:end] = flat_variable(nc, 'WCUR_quality_control') else: - WCUR[start:end] = np.full(n_obs, np.nan) + WCUR[start:end] = np.ma.masked WCURqc[start:end] = np.full(n_obs, 9) ##calculate depth and add CELL_INDEX diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries.py b/aodntools/timeseries_products/velocity_hourly_timeseries.py index c13272e..bcc0051 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries.py +++ b/aodntools/timeseries_products/velocity_hourly_timeseries.py @@ -32,16 +32,15 @@ def cell_velocity_resample(df, binning_function): :return: binned U, v, W CUR according to the binning function """ df_binned = df.apply(binning_function) - UCUR = np.array(df_binned['UCUR']) - VCUR = np.array(df_binned['VCUR']) - if 'WCUR' in df_binned: - WCUR = np.array(df_binned['WCUR']) - else: - WCUR = np.full(len(df), np.nan) - DEPTH = np.array(df_binned['DEPTH']) - - return UCUR, VCUR, WCUR, DEPTH - + binned_vars = [] + for var in ('UCUR', 'VCUR', 'WCUR', 'DEPTH'): + if var in df_binned: + x = np.ma.masked_array(df_binned[var], mask=np.isnan(df_binned[var])) + else: + x = np.ma.masked + binned_vars.append(x) + + return tuple(binned_vars) def append_resampled_values(nc_cell, ds, slice_start, binning_functions): """ diff --git a/test_aodntools/timeseries_products/IMOS_ANMN-NRS_AETVZ_20191016T080000Z_NRSROT-ADCP_FV01_NRSROT-ADCP-1910-Sentinel-or-Monitor-Workhorse-ADCP-44_END-20191018T100000Z_C-20200430T000000Z.nc b/test_aodntools/timeseries_products/IMOS_ANMN-NRS_AETVZ_20191016T080000Z_NRSROT-ADCP_FV01_NRSROT-ADCP-1910-Sentinel-or-Monitor-Workhorse-ADCP-44_END-20191018T100000Z_C-20200430T000000Z.nc index 30205a2c27b705988ae59bdee94d97d65fd05d36..44b87285037a76afc0a0b554007cca34a715dc79 100644 GIT binary patch delta 7303 zcmb_g2~<>9(ysgZAq_Si7DZ4%(5SeghJ>%aX~a{RNQskm&7G;bTq-Ky6-jiQ>$N zN{-dK@q^RSU@0qeS&KO4wk$VZ&Btko+VE_{7nJw86v-LiF)GBR0RYNxudpfEZ$J`VJ7nbf2K zcp-7F0w)MIVk;fMAIbYmyquso1Y0oxoskqC_wod9cWe!3&=AR|eK&f;3kh4@0AwWN zJDqO`-htSf>Lfu2{-9Qn#RYpG?V8^P7C2)o6`(GX;KhcH;9Un>D7y`kX+^1B;2>!) z00>0#Z9+kJ@HSxU9RP16w{|DRKr#)q1*nH)qIdl`@b<)3Z-Ayq?#SDF!mrqX3k=Ar zk*QZRE%2=qHqm}snq6;r77SPS)CmVJKP<|EC$88+H_+B{7mOGI9aK}vz(!@Yvcc@8 za5O;jS@bkBRFM3Z06HX>0x!Prt^k5N!+|TGd^`~*d0;CHGNCb2FOQVzu!Tn21H6r7 z!q?|!!&zG044@T~i}!7F;Cu27niYm*$REe@Ac|~{1Rw)*&)?015aK`?p-B48Jvh&_ zFSF0GsQTP}jx%2u=42U;kgCnbO1jjB?n^X=ZmdiKc6B2 zAO8*$+{wXO4EFa>}~I0XuS`SK&kB==_s1YpzA?2k2m zju<&$0o3(E4zv?v1BNXew-m1?YBo=g$)F^1ubcWbVKid+=V+N1oJ`* zB$aoz-`9l9gQN?OHDPo8(Yhy^a4UW6`3eS-)II<~Nd8!M?Ug3JcRrf+x?5&~8WPA6 z9ZXTp{|atdq}V(pA4PYgtJuv(v22;LAwz~&zs762G6o{kMdXTlBK;m z-Y?Uij|=sX0ylF@sCUmb{ zKYJNSnN>u+j$aB5VtQVM|IR$HeNY7DU6BidNJzArwnrE3P!4)96E^|x-+tZ$HdPH} z+VB~lS3LAO&GKcR{FQZ~z@bnQTPx;T1Kx)?99f+onfF?KoM4 zmm+ewKy5p@Gu{EU_B4PQj!NnWXZwZ07XsrTyiy=+zC65}9--^mEi{R66`(DlCCK1{ z1gb&13!+*I(0*67*g*pq8o+H+o|_xw@%-w^+f5x&^yIJJscS*iO2803L4U86a017D zXoP{I{g9z<8mg996fQ;h-^b|0Mebv6vcmy z_O&Z6kMrHZmq$mha~^ zh@@EMhfMDoOD+-=bcg%b(CNXvTd%oNtjG_RIw!`yQX_2+9Yeft5W*Mz+-pO38i;WS zy+ss2j-mHNjS?FF?UROYi|aKlp~wH8e=7x>P>0|&5ifEOB8R7#LXu%HG2dk3f+?c& zJn6-oQ+0F}k(w0cid;T?<`JkQA!tZ-biU0q2Kg9>?e3|yuY#SXY;%lFCyQ#5Mi+z= ze>%Dy2{`Hi$9-ws0FF-5Yz`bZ2AVA_l7mr!>Nkz;@HQRmbmfiW^G69^E0KG(Z?WXv zkiR>ozU%@w3v3$_Y&tpf5pTfDZf2I>+b^f zR}vGzHkF=IDXh@hmc^{p8J5m6wNlPFri?$1B}qj_o>)=P)ZLwyrH!P2e4SH@mePUT zl{**2C7Y7Kndh|gVf}f}%w~M&z?OVfrdOExh{^>Q1J>LS<;aQRpAOQ9;Iu4d)=hbz z!cI}boLGJ>)2H5>q0*V1*T$t_9fSS=yxoa?%Hxh?iLi6Se|A0Jf2E&);eN~9;NbwrQ-_6dC z4y>-9pa`Lu6pyl)3>VK>6yPJ?%tcp`_w=@RAqnW%sw9z`AaAH%d z@4Dj>eA?rW;>=zfT)|}=jRUM!>HcxHpdUv|^4>3J91=&ZYLs5OGmg(58Ni#44$m?l zRQT~#yXlABg;(|DRSz5<5!_|GGV3ZXTGYOFbo%p}SAi}$HMtI&mab47-GJF0?XBCg z8F5GyXii|g05d$l^)gy*=)cv6D|M6k7S6NmJ zTO~^g1C%XK+n_EhR%ob7VKi-doK7xokl)SLYJ!>Z_z8OcS&k2nH|r&{(UxH@cjNnv ztGRz+fGd5mqGvM4T@5vwzg4;bUyt>9#J`)>QFm3b!6UKR@MmgL#qU^nAPN&%cuVo| z1Isks#|}@y#P^!!uVEIckSITA8jS;q25+%;xdYT;?ne@9sCR3NJ;8kblkV zF;GPJ>^!~nVkK>Uu=(#Klb+$Dh7{FAv-c`x?#(6l=a+Fm)kL%R>Y7~Be=I!BBjI%99dP>RrP+alqpu8O1NZJ|$nio5tNgfa8zgzZe0yE0Ia8#X6Mu4aE zxda&2sK;KS<%?fbLqw}FekY}K0qh!sK>8R9ELVahO{}liFkd-m(WDRf)m1)j2P6om z;{pLMBJNp7r?5mztt{#zKOTrug78Ad*t2mdDY0-zP16kX$j#nfa@U6hCC{f3z0jrYfisl!%v>TmeXPE0WgUs9{+q{2VkDq9M!7izU; z4FRqTt_{Pk7K^E174J7wyE86@h^e$5{AM+a_uIC9^OC{wR41J@z~)SYldN zcTwl3zSYKZ;*BNo>7alb}}WHZ~!;@*;{-5RR!1ozFk*1bJg zb4A(B0*jvDo_*z}c*)nkk^)Fssqoc8V*{1-_QED6t{1dH&FRdhlWxxCrRzE< zJoa0F;JF=pr*qlwBiQ#6@q96`4VH`N+<&Ww%**;sm*5``Hq=bzs%5qPw=TVIH-rjV-CuAj#&x-BWfopHNINm-C!&yz8Ib^G>da zge@l3HiGFdVY)FSlP7KqwUzCZ-^isirO35a>{?mNwd9<#tmHI_le2$%9%x(e4eGh1 zzGs?u2|ZV)_wdt3Hm&pMSh|g`{U*ldyMLKZIx=cml$UjT8uN7ZyrzgXZxO36tj&lN zs|ScofOEn48$PwvRQ660>x0+ZqlrAO+{oR_n=gy?lMj4hO}34_wT~fOZKG{1 z?>y3#J)Fq;N__0kopl?Gj9+=~&pWSr%a&t4>4Jkke9!Yh-3Ok`cI9~oSKX{(|AAwU r;Hc|rt(w7nq$QqZJ~LSxz2xgvW|~ipCSK~u7BN!gT(+kLyQTX#GsTVv delta 10146 zcmb_C2Ut``x98qns({p`xCmHDL;(x7h;%^_6|fU2iwagSR*Wn*A~ph}2pSd95KAn0 zQPilY(WoItf4i|)6nm7!3h&I^yRetv_rCw-z46PQDQC`{IsHz!d(@!#H^Xn;`Bud_ zpNDXbb5cFIw32ltN@dHAZr8{lgQm^CR0C@r4Mhlk67-T_7m{ZXWKn%j94er)wqz1{ zXb`E$vIMeYn~GGfu-6u^=Gc0Mv`Gigk39NaKy-Kr7{hgXzz~3b2#jjL04~~MFAiWR zf=Ssn1_0LB3j&yqAn$h@YsfakUMvU05iIHZy$as&*y|3A$MK!7xPZzPCuSJ%Foire zbkhdo=$l>h+d-BQ_M!m>AaGx5<^%h!u!pqAAV^yi-4&jhV=osV2El=d+#aB!hkXGM ziQxXe{z34l9rjQPQ3xihoI+qhW9;zIDof+E&!nj zM%u?}V7hefG@Q8pWQ_)1nqm*d5RM=65o0id4FPE>aEji# z4M0x>*IchovJ_XP|w6Ths2~8-k9hiJ!!tP5Ma8ZF1tpSn{ zT&)sj!&V#Ybp}X5F#O|hbHShT?gtQpAoa?_x!_1Kkj4ZA1Lho?_kQ*8(>eZ5WX&)$ zEj@^~DfA~Dpa+Go=#L~18P_t!K?lkTUeceUtCaY&5g>pL66nfgfIvDpNLP?S)EYoF z9iYsphLKY({`!fm!feVnDy|m-nF64iuB-(Jqbtj({b3Ikh^HFk&s84!(1E^6AgmG2 zpnm$&m37h}f)4Zzc$`daGINs|lFW#}k!lw8jD`u2Ob2K=1L;5|`NAMN&^LgnkNN&2 z$7EsKfatIY^rEQ}B60}DM}p^PN^Yypq~?pwdD?Kd8NzLkbDUOkya;Lv-2mbds2i=A z4?)z=&_c%|$a}W^8wjV0#^s3!e)x6d0-08OjvkZ+t1WQ}&m4_l#G-NELN%S3i?=}F z7q#PC*>yCD3v*$yR&wWYh%&?3WSLCp$JPCo!5NByDjAQ!CiKB_nY^z!e7_PR>8;SV zh9UUPqhF!SLQZ+ct(RFzrB~Z6^+KjL5*$-g3M$Gg9-~2U?5XEInaz0)BS%5yMKO$E zDuT3G&5uJY+8wk)z7aec9a90Zlm=>RB!XwD;b&zUTWVE%PG&eAcKF`}ZG{CQ_eX&t zDC&LZA)KX}z^F0`!R5*wRWbv8-2aakG9$hHyzr&WxVOBpeh(RxD4Ok;2tMZAdN1>) z(&y>5yMj(k$2EYq^oN;^iOg&=sqJG^XVN=ib3QdK>$KqC`4We&ZKTzY%Q6MX;;}4% z%D4jkd+S0Ii%hbp1p0QV7h9>?^fe}nb}~K4zS+tYcsw@%6JOLJq_NoPHurk|} zMM9ak$fBq&8;S0tZ&R`~Aj@+yOM~U=PC#-^z7{gA*Qg!G-lvQJrz@=Zn+3V~s$R2f z&OVaDLOjLx0HCQOe50!+XlR;2b9F>uH=tMrhp+?Q=$Z)jZFuKOLn(k8@=va{cjN3y z4gRW#YX`TUG%7K7bfZKtmOD_?rene81j$ia#~2NH}cj zNR7{oJp00&?Cj{wVuy?Ycu6Uy0MMgApLtk9Z<2)M=}NV9EqgkUaif1f85c4hJ>EuO zoDiah58%jJp9DumB_$+X2%%01O$4XT%Xp>vw~m%n38oe-uK-xiB{|+P7FmbrCID2% zSSx`9b&JtjQp?6>g8#%;lUlwdAUZS%Cr~J~AW3w$oGq@^V`Zm4ry9T}Y3_G=MXZ9T zB$(!QP?3h~X|4mEz(7MK^3}xw9bp@QVV&w6iEnpfR9~;|?fX;8OmW$Ci(5m*8FN4j z7^b)n(kVK{feD@XT(qD$ZdQLAm>Vq7*JLv-OYRa4%7e%Pg{SFHt!P`Ie<2xF(7y=8 zOSfXGmGP@D0I25^uN?Q~56guC!=pIz(07nb87w{9@L7XXE+nP07rICKaL*aBOOo?pk@d3GaBV*hMq}}8PI6i#ma5{LW3fC zb5jx*xkEAbDUiNFj+~<~I>=Y4G>S7lNiC8b4;^I@wV%qFn&G3gl{ZNDusMoklm(Y> zr>(R`sm0s@k#<^q>=1chQK*ENrn>)Z;d(ldn4Te%0h(QC+iRq!9ku0mjJq~C}V@7y|p4(FLWEwrz&|{*|s}NMg z&N>N~B}Qm`q0s|ckochvW;C%rJiGS&>!#}u=uFT^+k)1AaR9W4kTEDb8GPv>h(?LX zP6Yj1%7g;?B9mPe>aR%?uZGX5$@!h@Vp{cWRqD3xFQl06C4KhMIsl+vKPm;Z8eOYV?4ilvg~ z-OMYEB+X|~f&ZK41NAh&ND}z}S@TF#)O^oRY5p>0VkK5gc!CQ5i|cA*M%DY@DLY{i$P!_134&dYzoV()jiH~1M27aq zaOaxuK$Ag2YvO;*o#Z8`Iy!HbPJyI_*UVUkGN2iXehnqM57CILjYWsSLDi^@zmQuA z4tDiZDZBhqLZUFWfjz0sZ)xU=XyQfxI8S^vD&+ywfkVjW&puo95e{S59m0+!)q(+b z?IC{tomjL9OyEOCE{e0SOSj@FV2ZR@6Y0}Su_m6(Vg((GC(v-l+9o9Jz#R-z>ZYd6B~+gz;ytb@iOctmcU~#Y!PBf+3MNToDoGkP6Wxz25m)PT{mPL$ zeHvB-N3t7Yxw$qSBnr1V3fEI1pksR%*eO>JySkBV{-K$V8sHwQ893zWx)I&a9aX>= ztajq66k?jk8_@;ihlfEgk_WOnrinNU)kpCXG2I^|N@JKYa!iv3!X@z}RveOvZx$9`4h%Xu!`En&b37p^SBh5Ow^I1^FD zGetQ|)DNcX6lLdJEX~25aOFW!xXw(tzl*}v7W$|zN>LM^q}X>mwH1~gS>@?ZOFJnW z4yM!&V#$EO^v|jQu%lagi!S8w(5R32*@iitX0{X4F(lSf3~yj2mN~LyBY4rYq~MsB zZRkz{m#NLDHTrAE{JGh@$#S&2FU1eGxu{Qw!*T_InC2u_K%Wg63-nd3?g~&!2l!3N zj9s4(84og+=e*vla~$D>X&PrNifm=w2Z!R3m~E8(dyRj~EX#$mhs|%EPU^#)i^M5> zof&v0rlED^O2Mw)J(Pnx9c<_xxtSu3daSX56HCdPd>@5HH1i9srgvc@ebq&aCBZ*c zU3)6;etN2_X{b6+x$2G;)T{2My~)yg)v+=n?jNX5x&jFLs?+BK^mzb%mYti-)JS4y zs$(vZMCo8l$cnn3&)7lOtBhmMm^#R48bYW+h( zg92b@S31O|#Q$c)LL}c9AGIAIGB_kSGMFsew9tg6K-vsR>)pMq)$!s;JON;5GI@F1 zMmQC5o#v}n{PsMZQ(8QT(IMS8ExpR3T#)EN%8z3^zF(iVh9_x7trY7b@cCkfGc7`f zJ&+!T@as!GT`Vv3ijY?kBE@AHrKP>blyN;Vr7}HJR+cXi6#$&+WqY9>yYJZa)MVsZ8- z3;Lp^cLttK<^(u>YMM{7CNbx%$hUq@B>cP=U+71A20D@a^IqiD(e~usd0T58H#Crl z+>!3bItgb?dvJ_5UCGXP8?P*1C1md1uBf{d4O#k^GQ&$XV;eov*%tA~u=&3#gv(^*0*gMpu$@(n{$N_I?qWfAXDHNhMHcOiC7uaMvdVvol#dh*RpU-aMjT->?Y( z@YtZ>{?Vb;zve+p+nE`!%6lj=!3uR9Gu>nlyV&yaLqZ^11fH`3ePBCsSJZ=!?b#i^dFI zNI7k-Gpp2 zw_$+cR*0zee)wZ>`L>ma2W>T12mlVdDI%e4%aBC zS&_bP%$0WWjeaK^-(`{5_gAo@v?lSdZODPg-O1S3T{&CgU2R7cPdtR8*M(HtShW*B ze+SYnz8n8wGMO5mE5wXW=9G6G&aWURlYa1c@U^HsTFlcRr+X7Mg8Po&D?&{n*(Pc2_L$Vvo$@0xHqw!(73h@M_#_&OT6EE>X=}AcggUipE}kD)cEgN2#FZ6U zaL*NHnnbn1hWP+{wsIZt|G5P7D{k0wT@-C9Va3ZHoLyNvJI>Wq@u5l_uE3#j*#sBP z!Ib~$^A#_8a4HGI^l<}>Hzs@$pX1+@FKnle=g<)EmPuLq2=2Z@JDuxG+AO{6XPMb& z%+B`XTn@J$a`I@{w`JLuaY@$Kj&}9`*}yO-&taIRG$m)e?OO}qLmMYrIwhA^CAxGX zdp6e$Zn^%Y@2dTO@7liVm(Hi6w~yFAy3<=T_lkF6KZR{rQ*~SuX&f?WdmAU)p%=p& z-`o#bFopx{B`Hl6m`@zNgCJy@ga+{!*Ju>bXp9l-;8@+s#aCWAP=g^nH7w?bZ5J=XsfG1vzg1J)lcuk|SUR-3e1IV4Y8>~a0Rs)cg&;ttLG4~SVk zHKN77inmXWsQAU+58k#6vJD=v@2fp`QufYET{P0eywLmp+q9oPwl7Jk+~V!-qiM0n zJt3t_?Dk8;jmM>2z25+cejWN|%F++fsn<-$cUgXZr$_m#&Tk6} zmt-C3?sDp7%7%z{ueQxqTO1EAdlDPm`cJ2%#)3L;er-;9mmf>x$l{uZH8&M)7kTWz z*X8t|?S0iIHih#N_8$D}mG1pU>5_&rW$aOHeg*2&d+p%f#N})KdK*>*C&UoVr zL>febdkciI+9?Xn)U8Jg?T1QsA)K{zxls z;P46PEz9HFr=EtE;Ge;?V|b}NWYdZaxI7-l(Dz#SJk421_dN4{iBDOu8zR$i6UM6q2`I9IogSO(XyZPk(uaQOChpVji3CK&_S z5^9l=bLS22Oo7L4&y0NZy(v7i3LL=PH6YG1{jmi&+(>u^EFhM!(Z_Dpx zOzEtOEst1at-^|YuEIoD&Z@AS9Kq^Poog_}JG(mC3z;S5^@z501*^^}7~*Hf_y zZy{_xoL!G>hsf<1Rb6GkkQcqYpClq5Tg%t6V1pluO<55w^nGG(tUSK*MI0IOF@adu z93tg!+v6qkdEP6aEZdsv$J0l>tp+O&_Taqus>x-T8rvE3lc$uqhR{yN6lq2|mCn={ z;k&5CKX8qi0P{Ojp1J?jHMnzzprT<4tn4bIWzoxo{y7=sS@<^>M%?RTgu!X;e*u4V BS^59~ diff --git a/test_aodntools/timeseries_products/IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV01_velocity-aggregated-timeseries_END-20191018_C-20200623.nc b/test_aodntools/timeseries_products/IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV01_velocity-aggregated-timeseries_END-20191018_C-20200623.nc index cba1b9159041d0f8c75c9261bcda676a318158c9..14c0539e6a0a6bb6288f3f9523875a722db38279 100644 GIT binary patch delta 15510 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 z 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 delta 56681 zcmc%R1#BB>z&`k-X`7^JxM6M@W`>5DnVFfHr(s5inVFffVP>X=nVJ6mcJI4NE1h&F zop#64=zYh2JTtO1vVVST-#fU&KDa2-cV;=!1yMFKY^-@(I7BHz-v;pZy>=lLD9x|;0OP+@!jBI z&5$uF6gW0$(;BVDWGNrACf(Tw3S0_A@Z*1j#}42%>OX!5J3z8Q|5p$^t0p+;4iX#! z#9M{;clzC7R!wshF#@;|XfyMFvkO_^HCS1{vxOkUqW{fO)rc1T&I*IPqtKwGntq@C z@8z!}co)}M<5sl`4{iX`?Lvc|F8cfYOh8%IXwWQmf6t=+%4Kx^J)^DZ>KcaxH~A}o zD)RS}8T}RTlK*?=`&VFF>+czD&BfsFfFr1D5)Hbl_wS94pv~Vi;_<&{$bSV=7XLRu zF!ejI0=ig4BR?km`!##|d+%Ui@Bcdb|9dq+{P+Ej;2?k>6}pG??G2@u7M#fgck*=Kq%mHC$tYPZ9z# z?i^n%vHH=>k*A6)rK(8#!|j%wjO(*GVg%$&a4x@ntsYFW;PjLE=9emO!R9}6ILXYkuB9uN@KE zTH~%}dKc>bVKj=sG3Tjc4OzG@d{Um7@GqtXohkW>9^NtSfc%X43JE#$Y3y&!TH+i*yN92dfcq{t4is3W|IsCzzafy6T_CJR^tqaGW{I^P5x5xTiQzuNk{-_xgYD z4&C-w9NA7|G5b?}Y_l>}Jgx-raNc=Mw3HnuN15b- zxxZxp^ivC+Ce|Ix%^-Dp{K}gV1;aHoqhq&6pBfcqjXBOZAQKj$n1LC>gf#&bJ0WB_(Lce@LP;ei}b!SfRW0bF0 z)iTlUv=6N~Ik%94YfN#!PYzvOXT{i?pTiBdDUI`P4L!mW7TcZ)^1G+2s?!?Jer|DE z=Ah{%cO-3(VLM}uodc;q+^P$?Z$4J1Fm*@FOf9eJ+7weIw58>(c)_CMl=NRao3Lp# z^LWLSG3iXHk&$ubZ=nOU8+1xiONSKEHb*L&>!LXvv(6;_C@dKW!`UmDxolX%*E3?8 z)s>)y)7XTfA_6w&*K4LC?q2dlCL^;EpGWeKz>6f8Q`tDfQ+s?tqKnT3c2m%SPw-Fu zZr_Zh)KPVlOUvCugBE-FLKpkZ@K;Ee5$l(Cb&E~R(B2DRAa4Na2Ps~@;&M?e7J9{e zW+x^z!5xiVot!J%o9iGbCp~B6r_8o3Xx1kGeEz*KfS*k+2n~DLo>oTTvonlT40#(!&sE@lO&-oOfL%d7aEl z?lS`>QPtL=ZSw=(KD!XHV*J*jP?vMBO?RJEOY*n|Q9bP!+LLBF3ixWGoToT!hbL4V zOLH1!2ils-9Q16Na|Ak!;tP-+O~$+E9S67|w`ff$O=AovBj|8?gG!5)!|PZD8@}8s zgj@qqX4@{!{z;C`&sXEmWp9CU4L_Esww37#(B#V&jbr`M$S^1|#+k1<6iw5JT;Ej9 zBITM$5&-*yK}!m2x}>A(mV+*|0V1xbzvMGt~gj#;no=g2tW$qXO%@4D;_c#{f z&#s$`h0{?ZPRS{xhT+CLp|gBFOQGTd{9k~hiym>vozwgT!Arfm2p;SB6Fr)E@IM z$vaxtsU@6C?X>jyJ0y zJEuj5UUQKv(7wMzZd~PTTdG;?Weu4TvUg{FHDr|6P~w&vUWD4zS@fo_C=47&U`Bkl z(x&R`<^Op0LR?P8NrRDdB!Stux|_ zK|mk~@OtPlK60CY<#PBnzomTqW%tU<|6y@mJd@GFPbdl}4{^jOeTM`Vtg{dr+yX2Q zoRr%%3L8NTqI)885p3Pm1d0TIz!gV;w{YNNj|I9Ux3*sTN6Wh>3(~6{)+@$=PN3SO zfR}UEw6IVRB3homxbg$QgU`-b{^O%Si~nQ*_;yzwzN=0x#CtMKfk22)j~_lTa$n{^ zWPg(4r}Yv!f0y|{kSl-vUbX>m4T=ndcY}u%Lkxbx1pAvaqusat?Jg5cD$L#2Ohf@f zm~2~K+Q$Yj@7E9XYd#w;TB{&e#xG`AotCQo^q-shXp!}?YW#E)fxN2l!MO!uUnpOP zK)xyb$%W;{j5_r%t0DO^g{J9vz+Ukt5+|I9e1gBY-d*- z9apVqcrf=ObHZNH)NUp1`rg!CMk>(H^4!D`0Mk5~Sd*?AdyK!Dt zYh6B9ZH4fJ5EJtW_P0@W3+_!!gMG(|3FxH2W#7~=&tI(cExsx>djjFwn*6DxsI3^L zl2TVk*fPU-OC(EPq~?dNMth-oJId}RWiG7(5{mlJ<88r=zypV#+UL~ApEV4v8w0D4 zE*cw42CBCMqn0-+cICRf>!#j&B4WNRA9mzaZ^{gss=+O$g?_EN!2p%p#FL~tFCU6R zbZ)NHQM=T#y6+stVAaR)7SvL=RNc?(T`*krojZ5xE^`Y;t0&?}IJub(gd`!KuM1~9 zcRm}vk8d8R25N9u-3g8Ke}CLCP8Dms4_Jn>cHaC6w!QqV+b(k8R0eQ5VlN2(iXY9N z(>j*$)&1j|>hZa1dn^9%-5d%0Amz1{)SZpb&o9LgLK{k=c2FQjrS+ou9La$Bqqc^* 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 QoS`g*Kz^uvHjwN80bqk!1ONa4 diff --git a/test_aodntools/timeseries_products/test_hourly_timeseries.py b/test_aodntools/timeseries_products/test_hourly_timeseries.py index b2658af..9e6a7d4 100644 --- a/test_aodntools/timeseries_products/test_hourly_timeseries.py +++ b/test_aodntools/timeseries_products/test_hourly_timeseries.py @@ -141,6 +141,8 @@ def test_some_files_without_good_data(self): for path, errors in bad_files.items(): self.assertEqual(NO_INWATER_DATA_FILE, path) self.assertIn('no in-water data', errors) + with Dataset(output_file) as dataset: + self.check_nan_values(dataset) def test_bad_timestamps(self): output_file, bad_files = hourly_aggregator(files_to_aggregate=SYD100_FILES, diff --git a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py index 7df05d6..ca8bd46 100644 --- a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py +++ b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py @@ -31,7 +31,7 @@ class TestVelocityHourlyTimeseries(BaseTestCase): EXPECTED_OUTPUT_FILE = os.path.join( - TEST_ROOT, 'IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220502.nc' + TEST_ROOT, 'IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220608.nc' ) def test_velocity_hourly(self): From 504161138891f045171e3fe0cc9b30c5b806447b Mon Sep 17 00:00:00 2001 From: mhidas Date: Thu, 9 Jun 2022 16:56:38 +1000 Subject: [PATCH 08/25] update velocity_hourly to properly handle missing WCUR --- .../velocity_hourly_timeseries.py | 7 ++++--- ...urly-timeseries_END-20191018_C-20220608.nc | Bin 244611 -> 244611 bytes 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries.py b/aodntools/timeseries_products/velocity_hourly_timeseries.py index bcc0051..2be4383 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries.py +++ b/aodntools/timeseries_products/velocity_hourly_timeseries.py @@ -185,9 +185,10 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir with xr.open_dataset(os.path.join(input_dir, file)) as nc: is_2D = 'HEIGHT_ABOVE_SENSOR' in list(nc.variables) + varlist_nc = [v for v in varlist if v in nc.variables.keys()] ## mask values with QC flag>2 - for var in varlist: + for var in varlist_nc: nc[var] = nc[var].where(nc[var+'_quality_control'] <= QC_FLAG_MAX) ## process in chunks @@ -209,12 +210,12 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir nc_cell = nc_chunk.sel(HEIGHT_ABOVE_SENSOR=cell_height) ## convert to absolute DEPTH nc_cell['DEPTH'] = nc_cell['DEPTH'] - cell_height - slice_end = append_resampled_values(nc_cell[varlist], ds, slice_start, binning_fun) + slice_end = append_resampled_values(nc_cell[varlist_nc], ds, slice_start, binning_fun) CELL_INDEX[slice_start:slice_end] = np.full(slice_end - slice_start, cell_idx, dtype=np.uint32) slice_start = slice_end else: - slice_end = append_resampled_values(nc_chunk[varlist], ds, slice_start, binning_fun) + slice_end = append_resampled_values(nc_chunk[varlist_nc], ds, slice_start, binning_fun) CELL_INDEX[slice_start:slice_end] = np.full(slice_end - slice_start, 0, dtype=np.uint32) slice_start = slice_end diff --git a/test_aodntools/timeseries_products/IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220608.nc b/test_aodntools/timeseries_products/IMOS_ANMN-NRS_VZ_20180816_NRSROT_FV02_velocity-hourly-timeseries_END-20191018_C-20220608.nc index c9c2e17a7ef83b267cbeaa5f9b619602e53bcd7c..067704789b6adea3f3f5007012227d98468c5fd0 100644 GIT binary patch delta 2245 zcmZqv&e!~%Z^MIp#_f{>Z;5aIk-tI#%G@yl#%!+GxV>T{W5A;Nw*iKIiyZ`VGL4)n znBo-}&63=AeGp=AQR(w6*ca3;ZDEl)nRDVZL4%3?_8*w)9$dK;%6pId5A*5U3oe#~ zhnIe>sj;d4vG4tCx%4LI2@jO^dOVJPc8{5L(gy{RS#}#8Rg(RP)O83T;YFbYX7*f zEw1J=%R`=Rzf?S>=5M%tdGZhKo-etV>*uOI6umqtTlxXJY`EaN*XMtW2|dy-IB%y? z`{}Cvz6bt$^8VEQD#)Bwrg=`ZUE!c>(8P07&&*}!N_py-@#0crY&oAp39n#j{kjx3 zt?ZT+&zJ1kp~$sHr|ju>5%o;=l=rFgoD$UU>1FPmc0pFAF6e@Hav|4ORjCHQHHSj0 z9&+Vrc&o2_%?5PXuF_cR?VE02oV-K2XG!Yxeeo$zMK52AwmiUZm8W#)dh9pdl#cZW zY%eGJUjP2(BWwMm(#P*FA78X;c9iK(J-2$EO)*D1a=a5mujo1Snl28^HZh+h>zmdy zi`O-TaglbgmX0^0-O3e`cRLnn9X**AV0yYEFikrk)GN~PHq)vLjLV{05BS;4@i7#e zHS^4@97WfX)8)2OiyiwyWEGdp%3Y;CSvq_3q76ygb%k#PZ&@Y#`D2FrogUju^KBEP zgL9tMe^&Xq;+Tw|m0TB3-IYA{gV$#1tNR`N&%Rsd^u&3aV~+cO{?TOrao5M!FO%ne zI9nXrUdb1v%sust(urr09IiF%D%%tk890Ow?0QzZO5HK;p^#?q5~rkD_tjPgbWQ2p zyI_LOWs{9|r~L#sTvRMJ-T!v$%W5xbpW-9Jpc?WWZGa7vdOx##sWlx7UU-m2i$G;L!v; zgcEQU({_PWCWnyGWIURThj22^VcK4}kEvD3afiG9DUqe`Tm(+lrxD{Xn z%adDm$Cy7?E?4RMwaM;}D)jrso<`5Qt*FT)J`OnYO6Rg@h%ltZTJPK1_&RasK}Uev7N}Cb=(_P8sjM z^ygsD^4rl zER3(Wj`i>eUU1$pCHY%3`>j-!WbQxO{BxK^OHJ-KPEFGk*ZY+sWwht~u6@qjr|Nes zl;TrmamrisJzx6= zUzj2r^F!~mP{#G*50OnQ8P36qESHXdIAFR!_Sz%oW1Y!GbKEao+sqv(X}OEXTWaGS zzS}3ON)AeGVxRN7;q4O5zQ6BpygYvY&h^TFf9k*VpZ;8P;-ein$YN3oMBkrN>^^f) zJoxei|20*I6*^aGrp{em!92xq*@@>%cJ0;_l;PpKS}m^rv*AqS>1w_v;U9aRUkz+5 zFZvv@toIY_1dI1|mhQUzOjg;-V1rigZY7ng&F}ObWICqX zw=>B&&f-#>FwfsVMt#fSs5>PEk7md`pSUITjnfs!zJ~`U73q{8DC^^j-O%=!^LgH( zvP&YLUzxx8@;Lw9Yn%UdztXo~bK71U##F*Nno>to>QG3jSxnmnQkfh=M$_wPdL0Vs zHHT??;XbBTCC7^XxG598?sh7is82D}$TAb#nbT{lE6bA`b;pRW^xrL)cW2eNAGxUC kFZDE9>b6D$E7OJ-|7SBWIDC(J&D!NzYP;S1A(PK70QNFV@Bjb+ From f5ebb085c98797b1187c335aebfb3e03c693e69a Mon Sep 17 00:00:00 2001 From: mhidas Date: Thu, 9 Jun 2022 11:57:45 +1000 Subject: [PATCH 09/25] get current UTC timestamps in the recommended way as per https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow + refactor into common module (addresses #125 for timeseries products only) --- .../aggregated_timeseries.py | 21 ++++++++----------- aodntools/timeseries_products/common.py | 12 ++++++++++- .../timeseries_products/gridded_timeseries.py | 18 +++++++--------- .../timeseries_products/hourly_timeseries.py | 16 +++++++------- .../velocity_aggregated_timeseries.py | 21 ++++++++----------- .../velocity_hourly_timeseries.py | 21 ++++++++----------- 6 files changed, 53 insertions(+), 56 deletions(-) diff --git a/aodntools/timeseries_products/aggregated_timeseries.py b/aodntools/timeseries_products/aggregated_timeseries.py index d82d01f..c3c121b 100644 --- a/aodntools/timeseries_products/aggregated_timeseries.py +++ b/aodntools/timeseries_products/aggregated_timeseries.py @@ -5,7 +5,6 @@ import os import shutil import tempfile -from datetime import datetime import numpy as np import xarray as xr @@ -13,7 +12,8 @@ from pkg_resources import resource_filename from aodntools import __version__ -from aodntools.timeseries_products.common import NoInputFilesError, check_file, in_water +from aodntools.timeseries_products.common import (NoInputFilesError, check_file, in_water, current_utc_timestamp, + TIMESTAMP_FORMAT, DATESTAMP_FORMAT) TEMPLATE_JSON = resource_filename(__name__, 'aggregated_timeseries_template.json') @@ -305,13 +305,10 @@ def main_aggregator(files_to_agg, var_to_agg, site_code, input_dir='', output_di ds['source_file'].setncatts(source_file_attributes(download_url_prefix, opendap_url_prefix)) ## set global attrs - timeformat = '%Y-%m-%dT%H:%M:%SZ' - file_timeformat = '%Y%m%d' - - time_start = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(timeformat) - time_end = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(timeformat) - time_start_filename = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(file_timeformat) - time_end_filename = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(file_timeformat) + time_start = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(TIMESTAMP_FORMAT) + time_end = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(TIMESTAMP_FORMAT) + time_start_filename = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(DATESTAMP_FORMAT) + time_end_filename = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(DATESTAMP_FORMAT) add_attribute = { 'title': ("Long Timeseries Velocity Aggregated product: " + var_to_agg + " at " + @@ -325,8 +322,8 @@ def main_aggregator(files_to_agg, var_to_agg, site_code, input_dir='', output_di 'geospatial_lat_max': np.max(ds['LATITUDE'][:]), 'geospatial_lon_min': np.min(ds['LONGITUDE'][:]), 'geospatial_lon_max': np.max(ds['LONGITUDE'][:]), - 'date_created': datetime.utcnow().strftime(timeformat), - 'history': datetime.utcnow().strftime(timeformat) + ': Aggregated file created.', + 'date_created': current_utc_timestamp(), + 'history': current_utc_timestamp() + ': Aggregated file created.', 'keywords': ', '.join([var_to_agg, 'AGGREGATED']), 'rejected_files': "\n".join(rejected_files), 'generating_code_version': __version__} @@ -348,7 +345,7 @@ def main_aggregator(files_to_agg, var_to_agg, site_code, input_dir='', output_di file_version = 1 output_name = '_'.join(['IMOS', facility_code, data_code, time_start_filename, site_code, ('FV0'+str(file_version)), (var_to_agg + "-" + product_type), - ('END-'+ time_end_filename), 'C-' + datetime.utcnow().strftime(file_timeformat)]) + '.nc' + ('END-'+ time_end_filename), 'C-' + current_utc_timestamp(DATESTAMP_FORMAT)]) + '.nc' ncout_path = os.path.join(output_dir, output_name) shutil.move(temp_outfile, os.path.join(output_dir, ncout_path)) diff --git a/aodntools/timeseries_products/common.py b/aodntools/timeseries_products/common.py index 7a454af..75c75f2 100644 --- a/aodntools/timeseries_products/common.py +++ b/aodntools/timeseries_products/common.py @@ -1,6 +1,12 @@ """Code shared by all timeseries product generating code""" +from datetime import datetime, timezone + import numpy as np +# Common date/time format strings +TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%SZ' +DATESTAMP_FORMAT = '%Y%m%d' + class NoInputFilesError(Exception): """Exception raised if there are no valid input files to aggregate""" @@ -183,4 +189,8 @@ def in_water(nc): :param nc: xarray dataset :return: xarray dataset """ - return nc.where(in_water_index(nc), drop=True) \ No newline at end of file + return nc.where(in_water_index(nc), drop=True) + + +def current_utc_timestamp(format=TIMESTAMP_FORMAT): + return datetime.now(timezone.utc).strftime(format) diff --git a/aodntools/timeseries_products/gridded_timeseries.py b/aodntools/timeseries_products/gridded_timeseries.py index 12a681a..87de0fc 100644 --- a/aodntools/timeseries_products/gridded_timeseries.py +++ b/aodntools/timeseries_products/gridded_timeseries.py @@ -3,7 +3,7 @@ import argparse import os.path import json -from datetime import datetime +from datetime import datetime, timezone import xarray as xr import pandas as pd @@ -11,6 +11,7 @@ from pkg_resources import resource_filename from aodntools import __version__ +from aodntools.timeseries_products.common import current_utc_timestamp, TIMESTAMP_FORMAT, DATESTAMP_FORMAT import aodntools.timeseries_products.aggregated_timeseries as TStools @@ -122,14 +123,12 @@ def generate_netcdf_output_filename(nc, facility_code, data_code, VoI, site_code :return: name of the output file """ - file_timeformat = '%Y%m%d' - if '_' in VoI: VoI = VoI.replace('_', '-') - t_start = pd.to_datetime(nc.TIME.min().values).strftime(file_timeformat) - t_end = pd.to_datetime(nc.TIME.max().values).strftime(file_timeformat) + t_start = pd.to_datetime(nc.TIME.min().values).strftime(DATESTAMP_FORMAT) + t_end = pd.to_datetime(nc.TIME.max().values).strftime(DATESTAMP_FORMAT) - output_name = '_'.join(['IMOS', facility_code, data_code, t_start, site_code, ('FV0'+str(file_version)), (VoI+"-"+product_type), ('END-'+ t_end), 'C-' + datetime.utcnow().strftime(file_timeformat)]) + '.nc' + output_name = '_'.join(['IMOS', facility_code, data_code, t_start, site_code, ('FV0'+str(file_version)), (VoI+"-"+product_type), ('END-'+ t_end), 'C-' + current_utc_timestamp(DATESTAMP_FORMAT)]) + '.nc' return output_name @@ -250,10 +249,9 @@ def grid_variable(input_file, VoI, depth_bins=None, max_separation=50, depth_bin for attr in ('geospatial_lat_min', 'geospatial_lat_max', 'geospatial_lon_min', 'geospatial_lon_max', 'site_code', 'included_values_flagged_as', 'contributor_name', 'contributor_role', 'contributor_email'): VoI_interpolated.attrs[attr] = input_global_attributes[attr] - timeformat = '%Y-%m-%dT%H:%M:%SZ' - date_start = pd.to_datetime(VoI_interpolated.TIME.values.min()).strftime(timeformat) - date_end = pd.to_datetime(VoI_interpolated.TIME.values.max()).strftime(timeformat) - date_created = datetime.utcnow().strftime(timeformat) + date_start = pd.to_datetime(VoI_interpolated.TIME.values.min()).strftime(TIMESTAMP_FORMAT) + date_end = pd.to_datetime(VoI_interpolated.TIME.values.max()).strftime(TIMESTAMP_FORMAT) + date_created = current_utc_timestamp() VoI_interpolated.attrs.update(global_attribute_dictionary) VoI_interpolated.attrs.update({ 'source_file': input_file, diff --git a/aodntools/timeseries_products/hourly_timeseries.py b/aodntools/timeseries_products/hourly_timeseries.py index a24a648..4ec548e 100644 --- a/aodntools/timeseries_products/hourly_timeseries.py +++ b/aodntools/timeseries_products/hourly_timeseries.py @@ -4,7 +4,6 @@ import json import os.path from collections import OrderedDict -from datetime import datetime import numpy as np import pandas as pd @@ -14,7 +13,8 @@ from aodntools import __version__ from aodntools.timeseries_products import aggregated_timeseries as utils -from aodntools.timeseries_products.common import NoInputFilesError, check_file, get_qc_variable_names, in_water +from aodntools.timeseries_products.common import (NoInputFilesError, check_file, get_qc_variable_names, in_water, + current_utc_timestamp, TIMESTAMP_FORMAT, DATESTAMP_FORMAT) TEMPLATE_JSON = resource_filename(__name__, 'hourly_timeseries_template.json') BINNING_METHOD_JSON = resource_filename(__name__, 'binning_method.json') @@ -180,8 +180,8 @@ def set_globalattr(nc_aggregated, templatefile, site_code, add_attribute, parame 'geospatial_lat_max': nc_aggregated.LATITUDE.values.max(), 'geospatial_lon_min': nc_aggregated.LONGITUDE.values.min(), 'geospatial_lon_max': nc_aggregated.LONGITUDE.values.max(), - 'date_created': datetime.utcnow().strftime(timeformat), - 'history': datetime.utcnow().strftime(timeformat) + ': Hourly aggregated file created.', + 'date_created': current_utc_timestamp(), + 'history': current_utc_timestamp() + ': Hourly aggregated file created.', 'keywords': ', '.join(parameter_names + ['HOURLY', 'AGGREGATED'])} global_metadata.update(agg_attr) global_metadata.update(add_attribute) @@ -259,14 +259,12 @@ def generate_netcdf_output_filename(nc, facility_code, data_code, site_code, pro :return: name of the output file """ - file_timeformat = '%Y%m%d' - - t_start = pd.to_datetime(nc.TIME.min().values).strftime(file_timeformat) - t_end = pd.to_datetime(nc.TIME.max().values).strftime(file_timeformat) + t_start = pd.to_datetime(nc.TIME.min().values).strftime(DATESTAMP_FORMAT) + t_end = pd.to_datetime(nc.TIME.max().values).strftime(DATESTAMP_FORMAT) output_name = '_'.join( ['IMOS', facility_code, data_code, t_start, site_code, ('FV0' + str(file_version)), product_type, - ('END-' + t_end), 'C-' + datetime.utcnow().strftime(file_timeformat)]) + '.nc' + ('END-' + t_end), 'C-' + current_utc_timestamp(DATESTAMP_FORMAT)]) + '.nc' return output_name diff --git a/aodntools/timeseries_products/velocity_aggregated_timeseries.py b/aodntools/timeseries_products/velocity_aggregated_timeseries.py index 450dc54..39d44bb 100644 --- a/aodntools/timeseries_products/velocity_aggregated_timeseries.py +++ b/aodntools/timeseries_products/velocity_aggregated_timeseries.py @@ -4,7 +4,6 @@ from netCDF4 import Dataset, num2date, stringtochar import numpy as np import json -from datetime import datetime import argparse from pkg_resources import resource_filename from aodntools import __version__ @@ -12,7 +11,8 @@ import xarray as xr from aodntools.timeseries_products import aggregated_timeseries as utils -from aodntools.timeseries_products.common import NoInputFilesError, check_velocity_file +from aodntools.timeseries_products.common import (NoInputFilesError, check_velocity_file, current_utc_timestamp, + TIMESTAMP_FORMAT, DATESTAMP_FORMAT) TEMPLATE_JSON = resource_filename(__name__, 'velocity_aggregated_timeseries_template.json') @@ -188,13 +188,10 @@ def velocity_aggregated(files_to_agg, site_code, input_dir='', output_dir='./', ds['source_file'].setncatts(utils.source_file_attributes(download_url_prefix, opendap_url_prefix)) ## set global attrs - timeformat = '%Y-%m-%dT%H:%M:%SZ' - file_timeformat = '%Y%m%d' - - time_start = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(timeformat) - time_end = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(timeformat) - time_start_filename = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(file_timeformat) - time_end_filename = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(file_timeformat) + time_start = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(TIMESTAMP_FORMAT) + time_end = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(TIMESTAMP_FORMAT) + time_start_filename = num2date(np.min(TIME[:]), time_units, time_calendar).strftime(DATESTAMP_FORMAT) + time_end_filename = num2date(np.max(TIME[:]), time_units, time_calendar).strftime(DATESTAMP_FORMAT) add_attribute = { 'title': ("Long Timeseries Velocity Aggregated product: " + ', '.join(varlist) + " at " + @@ -208,8 +205,8 @@ def velocity_aggregated(files_to_agg, site_code, input_dir='', output_dir='./', 'geospatial_lat_max': np.max(ds['LATITUDE']), 'geospatial_lon_min': np.min(ds['LONGITUDE']), 'geospatial_lon_max': np.max(ds['LONGITUDE']), - 'date_created': datetime.utcnow().strftime(timeformat), - 'history': datetime.utcnow().strftime(timeformat) + ': Aggregated file created.', + 'date_created': current_utc_timestamp(), + 'history': current_utc_timestamp() + ': Aggregated file created.', 'keywords': ', '.join(varlist + ['AGGREGATED']), 'rejected_files': "\n".join(bad_files.keys()), 'generating_code_version': __version__ @@ -235,7 +232,7 @@ def velocity_aggregated(files_to_agg, site_code, input_dir='', output_dir='./', file_version = 1 output_name = '_'.join(['IMOS', facility_code, data_code, time_start_filename, site_code, ('FV0'+str(file_version)), ("velocity-"+product_type), - ('END-'+ time_end_filename), 'C-' + datetime.utcnow().strftime(file_timeformat)]) + '.nc' + ('END-'+ time_end_filename), 'C-' + current_utc_timestamp(DATESTAMP_FORMAT)]) + '.nc' ncout_path = os.path.join(output_dir, output_name) shutil.move(temp_outfile, ncout_path) diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries.py b/aodntools/timeseries_products/velocity_hourly_timeseries.py index 2be4383..d04f2a3 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries.py +++ b/aodntools/timeseries_products/velocity_hourly_timeseries.py @@ -3,7 +3,6 @@ import os import shutil import tempfile -from datetime import datetime import numpy as np import pandas as pd @@ -13,7 +12,8 @@ import aodntools.timeseries_products.aggregated_timeseries as utils from aodntools import __version__ -from aodntools.timeseries_products.common import NoInputFilesError, check_velocity_file +from aodntools.timeseries_products.common import (NoInputFilesError, check_velocity_file, current_utc_timestamp, + TIMESTAMP_FORMAT, DATESTAMP_FORMAT) TEMPLATE_JSON = resource_filename(__name__, 'velocity_hourly_timeseries_template.json') QC_FLAG_MAX = 2 @@ -252,13 +252,10 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir ds['source_file'].setncatts(utils.source_file_attributes(download_url_prefix, opendap_url_prefix)) ## set global attrs - timeformat = '%Y-%m-%dT%H:%M:%SZ' - file_timeformat = '%Y%m%d' - - time_start = num2date(np.min(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(timeformat) - time_end = num2date(np.max(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(timeformat) - time_start_filename = num2date(np.min(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(file_timeformat) - time_end_filename = num2date(np.max(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(file_timeformat) + time_start = num2date(np.min(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(TIMESTAMP_FORMAT) + time_end = num2date(np.max(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(TIMESTAMP_FORMAT) + time_start_filename = num2date(np.min(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(DATESTAMP_FORMAT) + time_end_filename = num2date(np.max(TIME[:]), TIME_UNITS, TIME_CALENDAR).strftime(DATESTAMP_FORMAT) add_attribute = { @@ -273,8 +270,8 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir 'geospatial_lat_max': np.float64(np.max(ds['LATITUDE'])), 'geospatial_lon_min': np.float64(np.min(ds['LONGITUDE'])), 'geospatial_lon_max': np.float64(np.max(ds['LONGITUDE'])), - 'date_created': datetime.utcnow().strftime(timeformat), - 'history': datetime.utcnow().strftime(timeformat) + ': Aggregated file created.', + 'date_created': current_utc_timestamp(), + 'history': current_utc_timestamp() + ': Aggregated file created.', 'keywords': ', '.join(varlist + ['AGGREGATED']), 'rejected_files': "\n".join(bad_files.keys()), 'generating_code_version': __version__ @@ -306,7 +303,7 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir file_version = 2 output_name = '_'.join(['IMOS', facility_code, data_code, time_start_filename, site_code, ('FV0'+str(file_version)), ("velocity-"+product_type), - ('END-'+ time_end_filename), 'C-' + datetime.utcnow().strftime(file_timeformat)]) + '.nc' + ('END-'+ time_end_filename), 'C-' + current_utc_timestamp(DATESTAMP_FORMAT)]) + '.nc' ncout_path = os.path.join(output_dir, output_name) shutil.move(temp_outfile, ncout_path) From 87e8f72619df2f291ff3faca70561abf3dec3fa8 Mon Sep 17 00:00:00 2001 From: mhidas Date: Thu, 9 Jun 2022 17:04:11 +1000 Subject: [PATCH 10/25] use np.isclose to compare variables in unittests (sometimes there are insignificant changes in float variables) --- test_aodntools/base_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_aodntools/base_test.py b/test_aodntools/base_test.py index eb8eaf9..2d51428 100644 --- a/test_aodntools/base_test.py +++ b/test_aodntools/base_test.py @@ -68,7 +68,7 @@ def compare_variables(self, dataset, skip_vars=('source_file', 'instrument_id')) differences.append((var, "shapes differ")) # compare the raw data arrays (not the masked_array) - if not all(dataset[var][:].data == expected[var][:].data): + if not all(np.isclose(dataset[var][:].data, expected[var][:].data)): differences.append((var, "variable values differ")) self.assertEqual([], differences) From 7ee24838f67217f6ea7ac5ead5cab764d53fe80e Mon Sep 17 00:00:00 2001 From: mhidas Date: Wed, 15 Jun 2022 12:36:12 +1000 Subject: [PATCH 11/25] Fix velocity hourly IndexError (caused by time_deployment_start/end being well outside the time span covered by the data) --- aodntools/timeseries_products/velocity_hourly_timeseries.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries.py b/aodntools/timeseries_products/velocity_hourly_timeseries.py index d04f2a3..d49adf6 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries.py +++ b/aodntools/timeseries_products/velocity_hourly_timeseries.py @@ -193,9 +193,8 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir ## process in chunks ## in water only - chunk_start = np.datetime64(nc.attrs['time_deployment_start']) - chunk_end = np.datetime64(nc.attrs['time_deployment_end']) - + chunk_start = max(np.datetime64(nc.attrs['time_deployment_start']), nc.TIME.data.min()) + chunk_end = min(np.datetime64(nc.attrs['time_deployment_end']), nc.TIME.data.max()) time_increment = 60*60*24*chunk_size ## secs x mins x hours x days chunk_increment = np.timedelta64(time_increment, 's') chunk_partial = chunk_start + chunk_increment From a7397e525d1481f06dbbe33b4d0e5acb4a3fc9d3 Mon Sep 17 00:00:00 2001 From: mhidas Date: Mon, 20 Jun 2022 17:17:57 +1000 Subject: [PATCH 12/25] reduce hourly_timeseries memory usage --- aodntools/timeseries_products/hourly_timeseries.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/aodntools/timeseries_products/hourly_timeseries.py b/aodntools/timeseries_products/hourly_timeseries.py index 4ec548e..bc07953 100644 --- a/aodntools/timeseries_products/hourly_timeseries.py +++ b/aodntools/timeseries_products/hourly_timeseries.py @@ -410,10 +410,11 @@ def hourly_aggregator(files_to_aggregate, site_code, qcflags, input_dir='', outp # https://stackoverflow.com/questions/55786995/converting-cftime-datetimejulian-to-datetime/55787899#55787899 if isinstance(nc_clean.indexes['TIME'], xr.coding.cftimeindex.CFTimeIndex): nc_clean['TIME'] = nc_clean.indexes['TIME'].to_datetimeindex() - df_temp = nc_clean.to_dataframe() + df_temp = nc_clean[parameter_names].to_dataframe() ## keep TIME as the only index (for ADCP files it would be a MultiIndex at this point) - df_temp = df_temp.reset_index().set_index('TIME') + df_temp.reset_index(inplace=True) + df_temp.set_index('TIME', inplace=True) df_temp = df_temp[parameter_names] df_temp = PDresample_by_hour(df_temp, function_dict, function_stats) # do the magic From 0a1cbc3ce29da6e1adbf51da94f8c9a3c9f9f733 Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 5 Jul 2022 19:27:50 +1000 Subject: [PATCH 13/25] various updates to Dockerfile including: - update python version - remove unnecessary python 3.5 condition - update pyenv pre-requisites --- Dockerfile | 25 +++++++++---------------- docker-compose.yml | 2 +- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/Dockerfile b/Dockerfile index 91c246b..d3e884b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ ENV TZ=Australia/Hobart ENV LC_ALL C.UTF-8 ENV LANG C.UTF-8 ENV PATH /home/builder/.local/bin:$PATH -ENV PYTHON_VERSION 3.5.2 +ENV PYTHON_VERSION 3.8.13 RUN apt-get update && \ apt-get install -y software-properties-common && \ @@ -15,11 +15,6 @@ RUN apt-get update && \ RUN add-apt-repository ppa:rael-gc/rvm && apt-get update -RUN if [ X"$PYTHON_VERSION" = X"3.5.2" ]; \ - then apt-get install -y libssl1.0-dev; \ - else apt-get install -y libssl-dev; \ - fi - RUN apt-get install -y --no-install-recommends \ build-essential \ ca-certificates \ @@ -29,11 +24,10 @@ RUN apt-get install -y --no-install-recommends \ python3-dev \ wget \ libffi-dev \ - # Pyenv pre-requisites - make zlib1g-dev libbz2-dev libreadline-dev \ - libsqlite3-dev wget curl llvm libncurses5-dev \ - libncursesw5-dev xz-utils tk-dev libffi-dev \ - liblzma-dev python-openssl \ + # Pyenv pre-requisites (from https://github.com/pyenv/pyenv/wiki#suggested-build-environment) + make build-essential libssl-dev zlib1g-dev \ + libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ + libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev \ && rm -rf /var/lib/apt/lists/* # Set-up necessary Env vars for PyEnv @@ -48,13 +42,12 @@ RUN set -ex \ && pyenv rehash \ && chmod -R a+w $PYENV_ROOT/shims -RUN pip install --upgrade pip==20.3.4 setuptools==50.3.2 +RUN pip install --upgrade pip==22.1.2 setuptools==63.1.0 wheel RUN pip install \ - Cython==0.29 \ - numpy>=1.13.0 \ - bump2version==0.5.10 \ - wheel + Cython==0.29.30 \ + bump2version==1.0.1 \ + numpy==1.23.0 RUN useradd --create-home --no-log-init --shell /bin/bash --uid $BUILDER_UID builder USER builder diff --git a/docker-compose.yml b/docker-compose.yml index 4ac178b..f487b1f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '2' services: dev: - image: ncwriter-build + image: aodntools-build build: context: . args: From 7eb3f3e405cd17485c483ac64357cbb4ef920fd0 Mon Sep 17 00:00:00 2001 From: mhidas Date: Thu, 18 Aug 2022 17:29:42 +1000 Subject: [PATCH 14/25] fix functions that modify files_to_agg argument in place and add a simple test assertion to confirm fix --- aodntools/timeseries_products/aggregated_timeseries.py | 2 ++ .../timeseries_products/velocity_aggregated_timeseries.py | 3 +++ aodntools/timeseries_products/velocity_hourly_timeseries.py | 2 ++ .../timeseries_products/test_aggregated_timeseries.py | 1 + .../timeseries_products/test_velocity_aggregated_timeseries.py | 1 + .../timeseries_products/test_velocity_hourly_timeseries.py | 2 +- 6 files changed, 10 insertions(+), 1 deletion(-) diff --git a/aodntools/timeseries_products/aggregated_timeseries.py b/aodntools/timeseries_products/aggregated_timeseries.py index c3c121b..cda7380 100644 --- a/aodntools/timeseries_products/aggregated_timeseries.py +++ b/aodntools/timeseries_products/aggregated_timeseries.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse +from copy import deepcopy import json import os import shutil @@ -225,6 +226,7 @@ def main_aggregator(files_to_agg, var_to_agg, site_code, input_dir='', output_di rejected_files.append(file) ## remove bad files form the list and sort in chronological order + files_to_agg = deepcopy(files_to_agg) for file in bad_files.keys(): files_to_agg.remove(file) if len(files_to_agg) == 0: diff --git a/aodntools/timeseries_products/velocity_aggregated_timeseries.py b/aodntools/timeseries_products/velocity_aggregated_timeseries.py index 39d44bb..2a900cc 100644 --- a/aodntools/timeseries_products/velocity_aggregated_timeseries.py +++ b/aodntools/timeseries_products/velocity_aggregated_timeseries.py @@ -1,6 +1,8 @@ import os import tempfile import shutil +from copy import deepcopy + from netCDF4 import Dataset, num2date, stringtochar import numpy as np import json @@ -83,6 +85,7 @@ def velocity_aggregated(files_to_agg, site_code, input_dir='', output_dir='./', bad_files.update({file: error_list}) # remove bad files form the list and sort in chronological order + files_to_agg = deepcopy(files_to_agg) for file in bad_files.keys(): files_to_agg.remove(file) if len(files_to_agg) == 0: diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries.py b/aodntools/timeseries_products/velocity_hourly_timeseries.py index d49adf6..765196a 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries.py +++ b/aodntools/timeseries_products/velocity_hourly_timeseries.py @@ -3,6 +3,7 @@ import os import shutil import tempfile +from copy import deepcopy import numpy as np import pandas as pd @@ -117,6 +118,7 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir print(" ") ## remove bad files form the list + files_to_agg = deepcopy(files_to_agg) for file in bad_files.keys(): files_to_agg.remove(file) if len(files_to_agg) == 0: diff --git a/test_aodntools/timeseries_products/test_aggregated_timeseries.py b/test_aodntools/timeseries_products/test_aggregated_timeseries.py index 6c7e325..9f79d6c 100644 --- a/test_aodntools/timeseries_products/test_aggregated_timeseries.py +++ b/test_aodntools/timeseries_products/test_aggregated_timeseries.py @@ -29,6 +29,7 @@ def test_main_aggregator(self): output_file, bad_files = main_aggregator(INPUT_FILES, 'TEMP', 'NRSROT', input_dir=TEST_ROOT, output_dir='/tmp') + self.assertEqual(4, len(INPUT_FILES)) self.assertEqual(1, len(bad_files)) for file, errors in bad_files.items(): self.assertEqual(BAD_FILE, file) diff --git a/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py b/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py index 1e772fd..856e17f 100644 --- a/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py +++ b/test_aodntools/timeseries_products/test_velocity_aggregated_timeseries.py @@ -33,6 +33,7 @@ class TestVelocityAggregatedTimeseries(BaseTestCase): def test_velocity_aggregated(self): output_file, bad_files = velocity_aggregated(INPUT_FILES, 'NRSROT', input_dir=TEST_ROOT, output_dir='/tmp') + self.assertEqual(4, len(INPUT_FILES)) self.assertEqual(1, len(bad_files)) for file, errors in bad_files.items(): self.assertEqual(BAD_FILE, file) diff --git a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py index ca8bd46..d527f93 100644 --- a/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py +++ b/test_aodntools/timeseries_products/test_velocity_hourly_timeseries.py @@ -37,7 +37,7 @@ class TestVelocityHourlyTimeseries(BaseTestCase): def test_velocity_hourly(self): output_file, bad_files = velocity_hourly_aggregated(INPUT_FILES, 'NRSROT', input_dir=TEST_ROOT, output_dir='/tmp') - + self.assertEqual(4, len(INPUT_FILES)) self.assertEqual(1, len(bad_files)) for file, errors in bad_files.items(): self.assertEqual(BAD_FILE, file) From 84af75fef92841355d1b99247ca789b7bb988e3f Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 6 Sep 2022 14:20:42 +1000 Subject: [PATCH 15/25] use setuptools_scm for python package versioning --- .gitignore | 3 +++ aodntools/__init__.py | 4 ++++ pyproject.toml | 5 +++++ setup.py | 6 ++++-- 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 pyproject.toml diff --git a/.gitignore b/.gitignore index eef60be..defd38e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Ignore the version file, it's created on install +aodntools/_version.py + # Python files *.pyc *.egg-info diff --git a/aodntools/__init__.py b/aodntools/__init__.py index c57bfd5..e69837c 100644 --- a/aodntools/__init__.py +++ b/aodntools/__init__.py @@ -1 +1,5 @@ +try: + from ._version import version as __version__ +except ImportError: + __version__ = "Unknown/Not Installed" __version__ = '0.0.0' diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ef3da94 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,5 @@ +[build-system] +requires = ["setuptools>=42", "wheel", "setuptools_scm[toml]>=3.4"] + +[tool.setuptools_scm] +write_to = "aodntools/_version.py" diff --git a/setup.py b/setup.py index be44198..cbe40b9 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,8 @@ ] TESTS_REQUIRE = [ - 'pytest' + 'pytest', + 'setuptools_scm', ] EXTRAS_REQUIRE = { @@ -26,7 +27,8 @@ setup( name=PACKAGE_NAME, - version='0.0.0', + use_scm_version=True, + setup_requires=['setuptools_scm'], packages=find_packages(exclude=PACKAGE_EXCLUDES), package_data=PACKAGE_DATA, url='https://github.com/aodn', From c881e452bdbbf31725acd2995a8eb9823f410d0e Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 6 Sep 2022 14:21:14 +1000 Subject: [PATCH 16/25] update Jenkinsfile package step to build wheel correctly --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f414731..48b6f69 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -34,7 +34,7 @@ pipeline { } stage('package') { steps { - sh 'python setup.py bdist_wheel' + sh 'python -m build -w' } } } From 4cf89f62e4ebcdb8eeba54e4cdec26a0d640034b Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 6 Sep 2022 14:21:28 +1000 Subject: [PATCH 17/25] update Dockerfile to use setuptools_scm --- Dockerfile | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index d3e884b..0183cc9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,14 +16,11 @@ RUN apt-get update && \ RUN add-apt-repository ppa:rael-gc/rvm && apt-get update RUN apt-get install -y --no-install-recommends \ - build-essential \ ca-certificates \ git \ libmagic1 \ libudunits2-dev \ python3-dev \ - wget \ - libffi-dev \ # Pyenv pre-requisites (from https://github.com/pyenv/pyenv/wiki#suggested-build-environment) make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ @@ -42,12 +39,13 @@ RUN set -ex \ && pyenv rehash \ && chmod -R a+w $PYENV_ROOT/shims -RUN pip install --upgrade pip==22.1.2 setuptools==63.1.0 wheel +RUN pip install --upgrade pip==22.1.2 setuptools==63.1.0 wheel build RUN pip install \ Cython==0.29.30 \ bump2version==1.0.1 \ - numpy==1.23.0 + numpy==1.23.0 \ + setuptools-scm==7.0.4 RUN useradd --create-home --no-log-init --shell /bin/bash --uid $BUILDER_UID builder USER builder From 4167252d1ec97522ab135cde3b4379e431336acd Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 6 Sep 2022 14:21:49 +1000 Subject: [PATCH 18/25] update bumpversion script and remove config file --- .bumpversion.cfg | 18 ------------------ bumpversion.sh | 6 +++--- 2 files changed, 3 insertions(+), 21 deletions(-) delete mode 100644 .bumpversion.cfg diff --git a/.bumpversion.cfg b/.bumpversion.cfg deleted file mode 100644 index 6153423..0000000 --- a/.bumpversion.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[bumpversion] -commit = False -tag = False -tag_name = {new_version} -tag_message = Bump version to {new_version} -message = Bump version to {new_version} -parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? -serialize = - {major}.{minor}.{patch} - -[bumpversion:file:setup.py] -search = version='0.0.0' -replace = version='{new_version}' - -[bumpversion:file:aodntools/__init__.py] -search = __version__ = '0.0.0' -replace = __version__ = '{new_version}' - diff --git a/bumpversion.sh b/bumpversion.sh index 4559475..5ed0814 100755 --- a/bumpversion.sh +++ b/bumpversion.sh @@ -4,9 +4,9 @@ set -euxo pipefail main() { git fetch --prune origin "+refs/tags/*:refs/tags/*" - OLD_VERSION=$(git tag -l '*.*.*' --sort=-version:refname | head -n 1) - NEW_VERSION=$(bump2version --current-version $OLD_VERSION --list --tag --commit --allow-dirty patch | grep -oP '^new_version=\K.*$') - git push origin tag $NEW_VERSION + NEW_VERSION=$(bump2version --current-version $(git describe) --list --no-commit --tag \ + --tag-message 'Bump version to {new_version}' patch | grep -oP '^new_version=\K.*$') + git push origin tag v$NEW_VERSION exit 0 } From e94abe289304cd8b1a5978aef34b6b18b70e85cf Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:51:56 +1000 Subject: [PATCH 19/25] omit setup.py and __init__.py from codecov --- .coveragerc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.coveragerc b/.coveragerc index 9103da9..aee87c3 100644 --- a/.coveragerc +++ b/.coveragerc @@ -2,6 +2,8 @@ branch = True source = aodntools omit = + setup.py + aodntools/__init__.py examples/* test_aodntools/* From 240125cc27552ae7f6ac63c0c7d1f68ef8d8a81c Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:52:38 +1000 Subject: [PATCH 20/25] remove python 3.5 from GitHub test workflow --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 43364d6..48dada6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ '3.5', '3.8' ] + python-version: [ '3.8' ] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} From d17b81e945abd3852d08a57cd039dbd4a95c76ca Mon Sep 17 00:00:00 2001 From: Stefan Hattrell <29941279+digorgonzola@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:53:16 +1000 Subject: [PATCH 21/25] remove old __version__ from __init__.py --- aodntools/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/aodntools/__init__.py b/aodntools/__init__.py index e69837c..368d1d8 100644 --- a/aodntools/__init__.py +++ b/aodntools/__init__.py @@ -2,4 +2,3 @@ from ._version import version as __version__ except ImportError: __version__ = "Unknown/Not Installed" -__version__ = '0.0.0' From 06ea36efc0f53b0315cb4513a6f7c471f28ceadc Mon Sep 17 00:00:00 2001 From: Stefan Hattrell Date: Thu, 8 Sep 2022 12:02:04 +1000 Subject: [PATCH 22/25] bumpversion: optimise script - no longer require parsing the new version from bumpversion output. We can just push the tags using `git push --tags` and this will push just the new one that's been created - we do not need to specify `--no-commit` since this is the default behaviour - remove the 'v' prefix from git tag by using the `--tag-name` parameter --- bumpversion.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bumpversion.sh b/bumpversion.sh index 5ed0814..282027e 100755 --- a/bumpversion.sh +++ b/bumpversion.sh @@ -4,9 +4,9 @@ set -euxo pipefail main() { git fetch --prune origin "+refs/tags/*:refs/tags/*" - NEW_VERSION=$(bump2version --current-version $(git describe) --list --no-commit --tag \ - --tag-message 'Bump version to {new_version}' patch | grep -oP '^new_version=\K.*$') - git push origin tag v$NEW_VERSION + bump2version --current-version $(git describe) \ + --tag --tag-name {new_version} --tag-message 'Bump version to {new_version}' patch + git push --tags exit 0 } From 261129a951d140f73fa3a417a341f0eede9bea7c Mon Sep 17 00:00:00 2001 From: mhidas Date: Wed, 11 Jan 2023 13:32:35 +1100 Subject: [PATCH 23/25] basic unittest for gridded timeseries --- test_aodntools/base_test.py | 14 ++++- ...dded-timeseries_END-20190523_C-20230110.nc | Bin 0 -> 38048 bytes .../test_gridded_timeseries.py | 48 ++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 test_aodntools/timeseries_products/IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV02_TEMP-gridded-timeseries_END-20190523_C-20230110.nc create mode 100644 test_aodntools/timeseries_products/test_gridded_timeseries.py diff --git a/test_aodntools/base_test.py b/test_aodntools/base_test.py index 2d51428..8f4548b 100644 --- a/test_aodntools/base_test.py +++ b/test_aodntools/base_test.py @@ -51,7 +51,7 @@ def check_nan_values(self, dataset): "check that there are no NaN values in any variable (they should be fill values instead)" nan_vars = [(name, "contains NaN values") for name, var in dataset.variables.items() - if var.dtype in (np.dtype('float32'), np.dtype('float64')) and any(np.isnan(var[:])) + if var.dtype in (np.dtype('float32'), np.dtype('float64')) and np.isnan(var[:]).any() ] self.assertEqual([], nan_vars) @@ -59,6 +59,16 @@ def compare_variables(self, dataset, skip_vars=('source_file', 'instrument_id')) """Compare dimensions and values of all variables in dataset with those in self.EXPECTED_OUTPUT_FILE, except for variables listed in skip_vars. """ + + def _arrays_equal(testvar, expected): + """compare two numpy arrays, handling the case of scalar variables""" + if expected.shape == (): + if np.isclose(testvar, expected): + return True + elif (np.isclose(testvar, expected)).all(): + return True + return False + differences = [] with Dataset(self.EXPECTED_OUTPUT_FILE) as expected: for var in set(expected.variables.keys()) - set(skip_vars): @@ -68,7 +78,7 @@ def compare_variables(self, dataset, skip_vars=('source_file', 'instrument_id')) differences.append((var, "shapes differ")) # compare the raw data arrays (not the masked_array) - if not all(np.isclose(dataset[var][:].data, expected[var][:].data)): + if not _arrays_equal(dataset[var][:].data, expected[var][:].data): differences.append((var, "variable values differ")) self.assertEqual([], differences) diff --git a/test_aodntools/timeseries_products/IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV02_TEMP-gridded-timeseries_END-20190523_C-20230110.nc b/test_aodntools/timeseries_products/IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV02_TEMP-gridded-timeseries_END-20190523_C-20230110.nc new file mode 100644 index 0000000000000000000000000000000000000000..4c6411238ae67ef0e1733980530c39654bf64e21 GIT binary patch literal 38048 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 T9MV4hKXOR>^c`0;56by}aP^C& literal 0 HcmV?d00001 diff --git a/test_aodntools/timeseries_products/test_gridded_timeseries.py b/test_aodntools/timeseries_products/test_gridded_timeseries.py new file mode 100644 index 0000000..a93919f --- /dev/null +++ b/test_aodntools/timeseries_products/test_gridded_timeseries.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 + +import os +import unittest + +from netCDF4 import Dataset + +from test_aodntools.base_test import BaseTestCase +from aodntools import __version__ +from aodntools.timeseries_products.gridded_timeseries import grid_variable + + +TEST_ROOT = os.path.dirname(__file__) +INPUT_FILE = 'IMOS_ANMN-NRS_STZ_20181213_NRSROT_FV02_hourly-timeseries_END-20190523_C-20220428.nc' + + +class TestGriddedTimeseries(BaseTestCase): + EXPECTED_OUTPUT_FILE = os.path.join( + TEST_ROOT, 'IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV02_TEMP-gridded-timeseries_END-20190523_C-20230110.nc' + ) + + def test_grid_variable(self): + output_file = grid_variable(INPUT_FILE, 'TEMP', input_dir=TEST_ROOT, output_dir='/tmp') + + self.assertRegex(output_file, + r'IMOS_ANMN-NRS_TZ_20181213_NRSROT_FV02_TEMP-gridded-timeseries_END-20190523_C-\d{8}\.nc' + ) + + dataset = Dataset(output_file) + self.assertSetEqual(set(dataset.dimensions), {'TIME', 'DEPTH'}) + self.assertSetEqual(set(dataset.variables.keys()), + {'TIME', 'DEPTH', 'LATITUDE', 'LONGITUDE', 'TEMP', 'TEMP_count'}) + + # check metadata + self.assertEqual(__version__, dataset.generating_code_version) + self.assertIn(__version__, dataset.lineage) + self.assertIn('gridded_timeseries.py', dataset.lineage) + self.assertIn(INPUT_FILE, dataset.source_file) + + self.compare_global_attributes(dataset) + + self.check_nan_values(dataset) + + self.compare_variables(dataset) + + +if __name__ == '__main__': + unittest.main() From e713ce5ac8d3e1e0e151ebdd96d7848975a47e24 Mon Sep 17 00:00:00 2001 From: mhidas Date: Wed, 11 Jan 2023 15:59:13 +1100 Subject: [PATCH 24/25] fix encoding of fill values in gridded_timeseries (+ a bit of refactoring on the way) --- .../timeseries_products/gridded_timeseries.py | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/aodntools/timeseries_products/gridded_timeseries.py b/aodntools/timeseries_products/gridded_timeseries.py index 87de0fc..c19506c 100644 --- a/aodntools/timeseries_products/gridded_timeseries.py +++ b/aodntools/timeseries_products/gridded_timeseries.py @@ -4,6 +4,7 @@ import os.path import json from datetime import datetime, timezone +from collections import defaultdict import xarray as xr import pandas as pd @@ -91,24 +92,28 @@ def write_netCDF_aggfile(agg_dataset, output_path, encoding): return output_path -def set_variableattr(varlist, variable_attribute_dictionary, add_variable_attribute): +def set_variableattr(varlist, variable_attribute_dictionary): """ - set variables variables atributes + Set variable atributes, separate attributes that should be passed to xarray separately as encoding + parameters - :param varlist: list of variable names + :param varlist: list of variable names to pick out :param variable_attribute_dictionary: dictionary of the variable attributes - :param add_variable_attribute: additional attributes to add - :return: dictionary of attributes + :return: tuple (dictionary of attributes, dictionary of encoding attributes) """ - # with open(templatefile) as json_file: - # variable_metadata = json.load(json_file)['_variables'] - variable_attributes = {key: variable_attribute_dictionary[key] for key in varlist} - if len(add_variable_attribute)>0: - for key in add_variable_attribute.keys(): - variable_attributes[key].update(add_variable_attribute[key]) + encoding_attributes = {'_FillValue'} + time_encoding_attributes = {'units', 'calendar'} + variable_attributes = defaultdict(dict) + variable_encodings = defaultdict(dict) + for var in varlist: + for name, value in variable_attribute_dictionary[var].items(): + if name in encoding_attributes or (var == 'TIME' and name in time_encoding_attributes): + variable_encodings[var][name] = value + else: + variable_attributes[var][name] = value - return variable_attributes + return variable_attributes, variable_encodings def generate_netcdf_output_filename(nc, facility_code, data_code, VoI, site_code, product_type, file_version): """ @@ -237,10 +242,7 @@ def grid_variable(input_file, VoI, depth_bins=None, max_separation=50, depth_bin ## set variable attributes varlist = list(VoI_interpolated.variables) - add_variable_attribute = {} - variable_attributes = set_variableattr(varlist, variable_attribute_dictionary, add_variable_attribute) - time_units = variable_attributes['TIME'].pop('units') - time_calendar = variable_attributes['TIME'].pop('calendar') + variable_attributes, encoding = set_variableattr(varlist, variable_attribute_dictionary) for variable in varlist: VoI_interpolated[variable].attrs = variable_attributes[variable] @@ -293,22 +295,12 @@ def grid_variable(input_file, VoI, depth_bins=None, max_separation=50, depth_bin file_version=file_version) ncout_path = os.path.join(output_dir, ncout_filename) - encoding = {'TIME': {'_FillValue': None, - 'units': time_units, - 'calendar': time_calendar, - 'zlib': True, - 'complevel': 5}, - VoI: {'zlib': True, - 'complevel': 5, - 'dtype': np.dtype('float32')}, - VoI+'_count': {'dtype': np.dtype('int16'), - 'zlib': True, - 'complevel': 5}, - 'DEPTH': {'dtype': np.dtype('float32'), - 'zlib': True, - 'complevel': 5}, - 'LONGITUDE': {'_FillValue': False}, - 'LATITUDE': {'_FillValue': False}} + # data types and compression for encoding + for var in {'TIME', VoI, VoI+'_count', 'DEPTH'}: + encoding[var].update({'zlib': True, 'complevel': 5}) + encoding[VoI].update({'dtype': np.dtype('float32')}) + encoding[VoI+'_count'].update({'dtype': np.dtype('int16')}) + encoding['DEPTH'].update({'dtype': np.dtype('float32')}) write_netCDF_aggfile(VoI_interpolated, ncout_path, encoding) From e032a76e0f4e559e8c7a607392c906fd47fcb198 Mon Sep 17 00:00:00 2001 From: Marty Hidas Date: Mon, 16 Jan 2023 14:28:46 +1100 Subject: [PATCH 25/25] Fix issue with moving temporary files (#178) Fixing the temp file permission bug Fixes #167 (originally proposed in https://github.com/aodn/python-aodntools/pull/176) Co-authored-by: mphemming --- aodntools/timeseries_products/aggregated_timeseries.py | 5 +++-- .../timeseries_products/velocity_aggregated_timeseries.py | 5 +++-- aodntools/timeseries_products/velocity_hourly_timeseries.py | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/aodntools/timeseries_products/aggregated_timeseries.py b/aodntools/timeseries_products/aggregated_timeseries.py index cda7380..87c38ed 100644 --- a/aodntools/timeseries_products/aggregated_timeseries.py +++ b/aodntools/timeseries_products/aggregated_timeseries.py @@ -210,8 +210,9 @@ def main_aggregator(files_to_agg, var_to_agg, site_code, input_dir='', output_di rejected_files = [] # default name for temporary file. It will be renamed at the end - _, temp_outfile = tempfile.mkstemp(suffix='.nc', dir=output_dir) - + fd, temp_outfile = tempfile.mkstemp(suffix='.nc', dir=output_dir) + os.close(fd) + ## check files and get total number of flattened obs n_obs_total = 0 for file in files_to_agg: diff --git a/aodntools/timeseries_products/velocity_aggregated_timeseries.py b/aodntools/timeseries_products/velocity_aggregated_timeseries.py index 2a900cc..b5649ad 100644 --- a/aodntools/timeseries_products/velocity_aggregated_timeseries.py +++ b/aodntools/timeseries_products/velocity_aggregated_timeseries.py @@ -71,8 +71,8 @@ def velocity_aggregated(files_to_agg, site_code, input_dir='', output_dir='./', bad_files = {} # default name for temporary file. It will be renamed at the end - _, temp_outfile = tempfile.mkstemp(suffix='.nc', dir=output_dir) - + fd, temp_outfile = tempfile.mkstemp(suffix='.nc', dir=output_dir) + os.close(fd) ## check files and get total number of flattened obs n_obs_total = 0 for file in files_to_agg: @@ -237,6 +237,7 @@ def velocity_aggregated(files_to_agg, site_code, input_dir='', output_dir='./', ("velocity-"+product_type), ('END-'+ time_end_filename), 'C-' + current_utc_timestamp(DATESTAMP_FORMAT)]) + '.nc' ncout_path = os.path.join(output_dir, output_name) + shutil.move(temp_outfile, ncout_path) diff --git a/aodntools/timeseries_products/velocity_hourly_timeseries.py b/aodntools/timeseries_products/velocity_hourly_timeseries.py index 765196a..fd12b49 100644 --- a/aodntools/timeseries_products/velocity_hourly_timeseries.py +++ b/aodntools/timeseries_products/velocity_hourly_timeseries.py @@ -105,8 +105,8 @@ def velocity_hourly_aggregated(files_to_agg, site_code, input_dir='', output_dir chunk_size = 90 ## size in days ## default name for temporary file. It will be renamed at the end - _, temp_outfile = tempfile.mkstemp(suffix='.nc', dir=output_dir) - + fd, temp_outfile = tempfile.mkstemp(suffix='.nc', dir=output_dir) + os.close(fd) ## check files and get total number of flattened obs print("CHECKING FILES...") for index, file in enumerate(files_to_agg):