This is an automated email from the ASF dual-hosted git repository.

jjacob pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ingester.git


The following commit(s) were added to refs/heads/dev by this push:
     new d9cf0fa  SDAP-351: Fix reading of data with cftime.datetime.Gregorian 
type (#46)
d9cf0fa is described below

commit d9cf0faaeec4ec7b24410a93605191cb20ad7e3b
Author: Stepheny Perez <[email protected]>
AuthorDate: Wed Nov 10 13:56:23 2021 -0800

    SDAP-351: Fix reading of data with cftime.datetime.Gregorian type (#46)
    
    * Generalized datetime fix so all calendars are supported
    
    * Added unit tests for 4 calendar types (standard, missing attr, julian, 
gregorian
---
 .../GridMultiVariableReadingProcessor.py           |   2 +-
 .../reading_processors/GridReadingProcessor.py     |   2 +-
 ...JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc | Bin 0 -> 1854879 bytes
 .../20190630_d-ACRI-L4-CHL-MULTI_4KM-GLO-REP.nc    | Bin 0 -> 100835190 bytes
 ...SS_L4_multimission_global_7d_v1.0_2021-03-12.nc | Bin 0 -> 8307796 bytes
 .../test_GridMultiBandReadingProcessor.py          |  66 +++++++++++++++++----
 .../test_GridReadingProcessor.py                   |  65 +++++++++++++++++---
 7 files changed, 114 insertions(+), 21 deletions(-)

diff --git 
a/granule_ingester/granule_ingester/processors/reading_processors/GridMultiVariableReadingProcessor.py
 
b/granule_ingester/granule_ingester/processors/reading_processors/GridMultiVariableReadingProcessor.py
index dc28c19..c36b8d2 100644
--- 
a/granule_ingester/granule_ingester/processors/reading_processors/GridMultiVariableReadingProcessor.py
+++ 
b/granule_ingester/granule_ingester/processors/reading_processors/GridMultiVariableReadingProcessor.py
@@ -74,7 +74,7 @@ class GridMultiVariableReadingProcessor(TileReadingProcessor):
                     "Time slices must have length 1, but '{dim}' has length 
{dim_len}.".format(dim=self.time,
                                                                                
                dim_len=time_slice_len))
 
-            if isinstance(ds[self.time][time_slice.start].item(), 
cftime.DatetimeJulian):
+            if isinstance(ds[self.time][time_slice.start].item(), 
cftime.datetime):
                 ds[self.time] = ds.indexes[self.time].to_datetimeindex()
             new_tile.time = int(ds[self.time][time_slice.start].item() / 1e9)
 
diff --git 
a/granule_ingester/granule_ingester/processors/reading_processors/GridReadingProcessor.py
 
b/granule_ingester/granule_ingester/processors/reading_processors/GridReadingProcessor.py
index 725ba35..97f282c 100644
--- 
a/granule_ingester/granule_ingester/processors/reading_processors/GridReadingProcessor.py
+++ 
b/granule_ingester/granule_ingester/processors/reading_processors/GridReadingProcessor.py
@@ -47,7 +47,7 @@ class GridReadingProcessor(TileReadingProcessor):
                 raise RuntimeError(
                     "Time slices must have length 1, but '{dim}' has length 
{dim_len}.".format(dim=self.time,
                                                                                
                dim_len=time_slice_len))
-            if isinstance(ds[self.time][time_slice.start].item(), 
cftime.DatetimeJulian):
+            if isinstance(ds[self.time][time_slice.start].item(), 
cftime.datetime):
                 ds[self.time] = ds.indexes[self.time].to_datetimeindex()
             new_tile.time = int(ds[self.time][time_slice.start].item() / 1e9)
 
diff --git 
a/granule_ingester/tests/granules/20181231090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc
 
b/granule_ingester/tests/granules/20181231090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc
new file mode 100644
index 0000000..31ca293
Binary files /dev/null and 
b/granule_ingester/tests/granules/20181231090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc
 differ
diff --git 
a/granule_ingester/tests/granules/20190630_d-ACRI-L4-CHL-MULTI_4KM-GLO-REP.nc 
b/granule_ingester/tests/granules/20190630_d-ACRI-L4-CHL-MULTI_4KM-GLO-REP.nc
new file mode 100644
index 0000000..6fd6cd3
Binary files /dev/null and 
b/granule_ingester/tests/granules/20190630_d-ACRI-L4-CHL-MULTI_4KM-GLO-REP.nc 
differ
diff --git 
a/granule_ingester/tests/granules/OISSS_L4_multimission_global_7d_v1.0_2021-03-12.nc
 
b/granule_ingester/tests/granules/OISSS_L4_multimission_global_7d_v1.0_2021-03-12.nc
new file mode 100644
index 0000000..283bfe4
Binary files /dev/null and 
b/granule_ingester/tests/granules/OISSS_L4_multimission_global_7d_v1.0_2021-03-12.nc
 differ
diff --git 
a/granule_ingester/tests/reading_processors/test_GridMultiBandReadingProcessor.py
 
b/granule_ingester/tests/reading_processors/test_GridMultiBandReadingProcessor.py
index 607dd8b..3c47718 100644
--- 
a/granule_ingester/tests/reading_processors/test_GridMultiBandReadingProcessor.py
+++ 
b/granule_ingester/tests/reading_processors/test_GridMultiBandReadingProcessor.py
@@ -165,27 +165,71 @@ class TestReadHLSData(unittest.TestCase):
         self.assertRaises(RuntimeError, GridMultiVariableReadingProcessor, [], 
'lat', 'lon', time='time')
         return
 
-class TestReadGPMData(unittest.TestCase):
-    def test_generate_tile(self):
-        granule_path = path.join(path.dirname(__file__), 
'../granules/3B-DAY-E.MS.MRG.3IMERG.20070101-S000000-E235959.V06.nc4')
+
+class TestCalendars(unittest.TestCase):
+    """
+    Test that various calendars can be ingested into SDAP without error.
+    """
+    def assert_time_data(self, granule_name, time_var, lat_var, lon_var, 
data_vars):
+        granule_path = path.join(
+            path.dirname(__file__),
+            '../granules/',
+            granule_name
+        )
         dimensions_to_slices = {
-            'time': slice(0, 1),
-            'lat': slice(0, 30),
-            'lon': slice(0, 30)
+            time_var: slice(0, 1),
+            lat_var: slice(0, 30),
+            lon_var: slice(0, 30)
         }
 
-        tile  = nexusproto.NexusTile()
+        tile = nexusproto.NexusTile()
 
         with xr.open_dataset(granule_path, decode_cf=True) as ds:
             reading_processor = GridMultiVariableReadingProcessor(
-                ['HQprecipitation', 'HQprecipitation_cnt'],
-                'lat',
-                'lon',
-                time='time'
+                data_vars,
+                lat_var,
+                lon_var,
+                time=time_var
             )
             tile = reading_processor._generate_tile(ds, dimensions_to_slices, 
tile)
             assert tile.tile.grid_multi_variable_tile.time
 
+    def test_julian_calendar_tile(self):
+        self.assert_time_data(
+            
granule_name='3B-DAY-E.MS.MRG.3IMERG.20070101-S000000-E235959.V06.nc4',
+            time_var='time',
+            lat_var='lat',
+            lon_var='lon',
+            data_vars=['HQprecipitation', 'HQprecipitation_cnt']
+        )
+
+    def test_gregorian_calendar_tile(self):
+        self.assert_time_data(
+            granule_name='20190630_d-ACRI-L4-CHL-MULTI_4KM-GLO-REP.nc',
+            time_var='time',
+            lat_var='lat',
+            lon_var='lon',
+            data_vars=['CHL', 'CHL_error']
+        )
+
+    def test_standard_calendar_tile(self):
+        self.assert_time_data(
+            granule_name='OISSS_L4_multimission_global_7d_v1.0_2021-03-12.nc',
+            time_var='time',
+            lat_var='latitude',
+            lon_var='longitude',
+            data_vars=['sss', 'sss_uncertainty']
+        )
+
+    def test_missing_calendar_tile(self):
+        self.assert_time_data(
+            
granule_name='20181231090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc',
+            time_var='time',
+            lat_var='lat',
+            lon_var='lon',
+            data_vars=['analysed_sst', 'analysis_error']
+        )
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git 
a/granule_ingester/tests/reading_processors/test_GridReadingProcessor.py 
b/granule_ingester/tests/reading_processors/test_GridReadingProcessor.py
index 6cfa835..ef78394 100644
--- a/granule_ingester/tests/reading_processors/test_GridReadingProcessor.py
+++ b/granule_ingester/tests/reading_processors/test_GridReadingProcessor.py
@@ -347,22 +347,71 @@ class TestReadHLSData(unittest.TestCase):
         self.assertRaises(RuntimeError, GridReadingProcessor, [], 'lat', 
'lon', time='time')
         return
 
-class TestReadGPMData(unittest.TestCase):
-    def test_generate_tile(self):
-        granule_path = path.join(path.dirname(__file__), 
'../granules/3B-DAY-E.MS.MRG.3IMERG.20070101-S000000-E235959.V06.nc4')
+class TestCalendars(unittest.TestCase):
+    """
+    Test that various calendars can be ingested into SDAP without error.
+    """
+
+    def assert_time_data(self, granule_name, time_var, lat_var, lon_var, 
data_var):
+        granule_path = path.join(
+            path.dirname(__file__),
+            '../granules/',
+            granule_name
+        )
         dimensions_to_slices = {
-            'time': slice(0, 1),
-            'lat': slice(0, 30),
-            'lon': slice(0, 30)
+            time_var: slice(0, 1),
+            lat_var: slice(0, 30),
+            lon_var: slice(0, 30)
         }
 
-        tile  = nexusproto.NexusTile()
+        tile = nexusproto.NexusTile()
 
         with xr.open_dataset(granule_path, decode_cf=True) as ds:
-            reading_processor = GridReadingProcessor(['HQprecipitation'], 
'lat', 'lon', time='time')
+            reading_processor = GridReadingProcessor(
+                [data_var],
+                lat_var,
+                lon_var,
+                time=time_var
+            )
             tile = reading_processor._generate_tile(ds, dimensions_to_slices, 
tile)
             assert tile.tile.grid_tile.time
 
+    def test_julian_calendar_tile(self):
+        self.assert_time_data(
+            
granule_name='3B-DAY-E.MS.MRG.3IMERG.20070101-S000000-E235959.V06.nc4',
+            time_var='time',
+            lat_var='lat',
+            lon_var='lon',
+            data_var='HQprecipitation'
+        )
+
+    def test_gregorian_calendar_tile(self):
+        self.assert_time_data(
+            granule_name='20190630_d-ACRI-L4-CHL-MULTI_4KM-GLO-REP.nc',
+            time_var='time',
+            lat_var='lat',
+            lon_var='lon',
+            data_var='CHL'
+        )
+
+    def test_standard_calendar_tile(self):
+        self.assert_time_data(
+            granule_name='OISSS_L4_multimission_global_7d_v1.0_2021-03-12.nc',
+            time_var='time',
+            lat_var='latitude',
+            lon_var='longitude',
+            data_var='sss'
+        )
+
+    def test_missing_calendar_tile(self):
+        self.assert_time_data(
+            
granule_name='20181231090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc',
+            time_var='time',
+            lat_var='lat',
+            lon_var='lon',
+            data_var='analysed_sst'
+        )
+
 
 if __name__ == '__main__':
     unittest.main()

Reply via email to