From a689f095f6f643649361f3eda0eb2728dd441ed6 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Thu, 1 Mar 2018 15:48:44 -0700 Subject: [PATCH] Backport PR #10631: Convert NaT to nan in date2num --- lib/matplotlib/dates.py | 7 +++++++ lib/matplotlib/tests/test_dates.py | 21 ++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 3e5baa1c1c03..3c9a67e04a92 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -290,6 +290,13 @@ def _dt64_to_ordinalf(d): dt += extra.astype(np.float64) / 1.0e9 dt = dt / SEC_PER_DAY + 1.0 + NaT_int = np.datetime64('NaT').astype(np.int64) + d_int = d.astype(np.int64) + try: + dt[d_int == NaT_int] = np.nan + except TypeError: + if d_int == NaT_int: + dt = np.nan return dt diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index fbdf054b1882..dfc5d3bda399 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -51,7 +51,8 @@ def test_date_numpyx(): datetime.datetime(2017, 1, 1, 3, 1, 1)]]]) @pytest.mark.parametrize('dtype', ['datetime64[s]', 'datetime64[us]', - 'datetime64[ms]']) + 'datetime64[ms]', + 'datetime64[ns]']) def test_date_date2num_numpy(t0, dtype): time = mdates.date2num(t0) tnp = np.array(t0, dtype=dtype) @@ -59,6 +60,24 @@ def test_date_date2num_numpy(t0, dtype): assert np.array_equal(time, nptime) +@pytest.mark.parametrize('dtype', ['datetime64[s]', + 'datetime64[us]', + 'datetime64[ms]', + 'datetime64[ns]']) +def test_date2num_NaT(dtype): + t0 = datetime.datetime(2017, 1, 1, 0, 1, 1) + tmpl = [mdates.date2num(t0), np.nan] + tnp = np.array([t0, 'NaT'], dtype=dtype) + nptime = mdates.date2num(tnp) + np.testing.assert_array_equal(tmpl, nptime) + + +@pytest.mark.parametrize('units', ['s', 'ms', 'us', 'ns']) +def test_date2num_NaT_scalar(units): + tmpl = mdates.date2num(np.datetime64('NaT', units)) + assert np.isnan(tmpl) + + @image_comparison(baseline_images=['date_empty'], extensions=['png']) def test_date_empty(): # make sure mpl does the right thing when told to plot dates even