From b38441608b724cc0db30d88da3c929ee1b8bbd7a Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Wed, 10 Oct 2018 21:57:13 +0100 Subject: [PATCH] Ensure QuadMesh with xarray handles datetime range --- holoviews/core/data/xarray.py | 9 +++++--- .../tests/core/data/testxarrayinterface.py | 22 ++++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/holoviews/core/data/xarray.py b/holoviews/core/data/xarray.py index fa2344113c..30ed4c513e 100644 --- a/holoviews/core/data/xarray.py +++ b/holoviews/core/data/xarray.py @@ -200,7 +200,10 @@ def range(cls, dataset, dimension): dim = dataset.get_dimension(dimension, strict=True).name if dataset._binned and dimension in dataset.kdims: data = cls.coords(dataset, dim, edges=True) - dmin, dmax = np.nanmin(data), np.nanmax(data) + if data.dtype.kind == 'M': + dmin, dmax = data.min(), data.max() + else: + dmin, dmax = np.nanmin(data), np.nanmax(data) else: data = dataset.data[dim] if len(data): @@ -211,8 +214,8 @@ def range(cls, dataset, dimension): da = dask_array_module() if da and isinstance(dmin, da.Array): dmin, dmax = da.compute(dmin, dmax) - dmin = dmin if np.isscalar(dmin) else dmin.item() - dmax = dmax if np.isscalar(dmax) else dmax.item() + dmin = dmin if np.isscalar(dmin) or isinstance(dmin, util.datetime_types) else dmin.item() + dmax = dmax if np.isscalar(dmax) or isinstance(dmax, util.datetime_types) else dmax.item() return dmin, dmax diff --git a/holoviews/tests/core/data/testxarrayinterface.py b/holoviews/tests/core/data/testxarrayinterface.py index d7e50d739d..67cb4e5a1e 100644 --- a/holoviews/tests/core/data/testxarrayinterface.py +++ b/holoviews/tests/core/data/testxarrayinterface.py @@ -1,3 +1,4 @@ +import datetime as dt from collections import OrderedDict from nose.plugins.attrib import attr from unittest import SkipTest @@ -12,7 +13,7 @@ from holoviews.core.data import Dataset, concat from holoviews.core.dimension import Dimension from holoviews.core.spaces import HoloMap -from holoviews.element import Image, RGB, HSV +from holoviews.element import Image, RGB, HSV, QuadMesh from .testimageinterface import ( Image_ImageInterfaceTests, RGB_ImageInterfaceTests, HSV_ImageInterfaceTests @@ -181,6 +182,25 @@ def test_zero_sized_coordinates_range(self): self.assertTrue(np.isnan(z0)) self.assertTrue(np.isnan(z1)) + def test_datetime_bins_range(self): + xs = [dt.datetime(2018, 1, i) for i in range(1, 11)] + ys = np.arange(10) + array = np.random.rand(10, 10) + ds = QuadMesh((xs, ys, array)) + self.assertEqual(ds.interface.datatype, 'xarray') + expected = (dt.datetime(2017, 12, 31, 12, 0), dt.datetime(2018, 1, 10, 12, 0)) + self.assertEqual(ds.range('x'), expected) + + def test_datetime64_bins_range(self): + xs = [np.datetime64(dt.datetime(2018, 1, i)) for i in range(1, 11)] + ys = np.arange(10) + array = np.random.rand(10, 10) + ds = QuadMesh((xs, ys, array)) + self.assertEqual(ds.interface.datatype, 'xarray') + expected = (np.datetime64(dt.datetime(2017, 12, 31, 12, 0)), + np.datetime64(dt.datetime(2018, 1, 10, 12, 0))) + self.assertEqual(ds.range('x'), expected) + def test_dataset_array_init_hm(self): "Tests support for arrays (homogeneous)" raise SkipTest("Not supported")