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")