From 1de890b5eeb2f17370626848f195e0ba4267cc73 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Wed, 5 Apr 2023 10:27:08 +0800 Subject: [PATCH 1/7] Update the array_to_datetime doctest for pandas 2.0.0 --- pygmt/clib/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygmt/clib/conversion.py b/pygmt/clib/conversion.py index fc304d5505b..915dfff7248 100644 --- a/pygmt/clib/conversion.py +++ b/pygmt/clib/conversion.py @@ -280,7 +280,7 @@ def array_to_datetime(array): >>> # numpy.datetime64 array >>> x = np.array( ... ["2010-06-01", "2011-06-01T12", "2012-01-01T12:34:56"], - ... dtype="datetime64", + ... dtype="datetime64[ns]", ... ) >>> array_to_datetime(x) DatetimeIndex(['2010-06-01 00:00:00', '2011-06-01 12:00:00', From 608e29bf59ea1340b12971c39fe6083dc11f15c2 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Wed, 5 Apr 2023 21:17:40 +0800 Subject: [PATCH 2/7] Refactor array_to_datetime to use np.asarray(array, dtype=np.datetime64) --- pygmt/clib/conversion.py | 50 +++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/pygmt/clib/conversion.py b/pygmt/clib/conversion.py index 915dfff7248..4aa525e17d5 100644 --- a/pygmt/clib/conversion.py +++ b/pygmt/clib/conversion.py @@ -4,7 +4,6 @@ import warnings import numpy as np -import pandas as pd from pygmt.exceptions import GMTInvalidInput @@ -252,10 +251,9 @@ def kwargs_to_ctypes_array(argument, kwargs, dtype): def array_to_datetime(array): """ - Convert an 1-D datetime array from various types into pandas.DatetimeIndex - (i.e., numpy.datetime64). + Convert an 1-D datetime array from various types into numpy.datetime64. - If the input array is not in legal datetime formats, raise a "ParseError" + If the input array is not in legal datetime formats, raise a ValueError exception. Parameters @@ -272,7 +270,12 @@ def array_to_datetime(array): Returns ------- - array : 1-D datetime array in pandas.DatetimeIndex (i.e., numpy.datetime64) + array : 1-D datetime array in numpy.datetime64 + + Raises + ------ + ValueError + If the datetime string is invalid. Examples -------- @@ -283,21 +286,21 @@ def array_to_datetime(array): ... dtype="datetime64[ns]", ... ) >>> array_to_datetime(x) - DatetimeIndex(['2010-06-01 00:00:00', '2011-06-01 12:00:00', - '2012-01-01 12:34:56'], - dtype='datetime64[ns]', freq=None) + array(['2010-06-01T00:00:00.000000000', '2011-06-01T12:00:00.000000000', + '2012-01-01T12:34:56.000000000'], dtype='datetime64[ns]') >>> # pandas.DateTimeIndex array + >>> import pandas as pd >>> x = pd.date_range("2013", freq="YS", periods=3) - >>> array_to_datetime(x) # doctest: +NORMALIZE_WHITESPACE - DatetimeIndex(['2013-01-01', '2014-01-01', '2015-01-01'], - dtype='datetime64[ns]', freq='AS-JAN') + >>> array_to_datetime(x) + array(['2013-01-01T00:00:00.000000000', '2014-01-01T00:00:00.000000000', + '2015-01-01T00:00:00.000000000'], dtype='datetime64[ns]') >>> # Python's built-in date and datetime >>> x = [datetime.date(2018, 1, 1), datetime.datetime(2019, 1, 1)] - >>> array_to_datetime(x) # doctest: +NORMALIZE_WHITESPACE - DatetimeIndex(['2018-01-01', '2019-01-01'], - dtype='datetime64[ns]', freq=None) + >>> array_to_datetime(x) + array(['2018-01-01T00:00:00.000000', '2019-01-01T00:00:00.000000'], + dtype='datetime64[us]') >>> # Raw datetime strings in various format >>> x = [ @@ -305,16 +308,11 @@ def array_to_datetime(array): ... "2018-02", ... "2018-03-01", ... "2018-04-01T01:02:03", - ... "5/1/2018", - ... "Jun 05, 2018", - ... "2018/07/02", ... ] >>> array_to_datetime(x) - DatetimeIndex(['2018-01-01 00:00:00', '2018-02-01 00:00:00', - '2018-03-01 00:00:00', '2018-04-01 01:02:03', - '2018-05-01 00:00:00', '2018-06-05 00:00:00', - '2018-07-02 00:00:00'], - dtype='datetime64[ns]', freq=None) + array(['2018-01-01T00:00:00', '2018-02-01T00:00:00', + '2018-03-01T00:00:00', '2018-04-01T01:02:03'], + dtype='datetime64[s]') >>> # Mixed datetime types >>> x = [ @@ -322,8 +320,8 @@ def array_to_datetime(array): ... np.datetime64("2018-01-01"), ... datetime.datetime(2018, 1, 1), ... ] - >>> array_to_datetime(x) # doctest: +NORMALIZE_WHITESPACE - DatetimeIndex(['2018-01-01', '2018-01-01', '2018-01-01'], - dtype='datetime64[ns]', freq=None) + >>> array_to_datetime(x) + array(['2018-01-01T00:00:00.000000', '2018-01-01T00:00:00.000000', + '2018-01-01T00:00:00.000000'], dtype='datetime64[us]') """ - return pd.to_datetime(array) + return np.asarray(array, dtype=np.datetime64) From 2ac723efaa81bfc170386aac5b665cb2474ac8e4 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Wed, 5 Apr 2023 21:18:56 +0800 Subject: [PATCH 3/7] Use array_to_datetime in _check_dtype_and_dim --- pygmt/clib/session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygmt/clib/session.py b/pygmt/clib/session.py index e19d213b502..f10ab72a19a 100644 --- a/pygmt/clib/session.py +++ b/pygmt/clib/session.py @@ -745,7 +745,7 @@ def _check_dtype_and_dim(self, array, ndim): if array.dtype.type not in DTYPES: try: # Try to convert any unknown numpy data types to np.datetime64 - array = np.asarray(array, dtype=np.datetime64) + array = array_to_datetime(array) except ValueError as e: raise GMTInvalidInput( f"Unsupported numpy data type '{array.dtype.type}'." From 51a44256e1e2eea2a7fef0940103c6c3e1d16de1 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Thu, 6 Apr 2023 10:32:22 +0800 Subject: [PATCH 4/7] Fix a typo --- pygmt/clib/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygmt/clib/conversion.py b/pygmt/clib/conversion.py index 4aa525e17d5..a3b6b56a776 100644 --- a/pygmt/clib/conversion.py +++ b/pygmt/clib/conversion.py @@ -251,7 +251,7 @@ def kwargs_to_ctypes_array(argument, kwargs, dtype): def array_to_datetime(array): """ - Convert an 1-D datetime array from various types into numpy.datetime64. + Convert n 1-D datetime array from various types into numpy.datetime64. If the input array is not in legal datetime formats, raise a ValueError exception. From ada56160140b4ea03c50f2c6436450b98c1f4bca Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Thu, 6 Apr 2023 10:44:02 +0800 Subject: [PATCH 5/7] Add a sentence about non-ISO datetime strings --- examples/tutorials/advanced/date_time_charts.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/tutorials/advanced/date_time_charts.py b/examples/tutorials/advanced/date_time_charts.py index 9130329c577..33fb9b554d3 100644 --- a/examples/tutorials/advanced/date_time_charts.py +++ b/examples/tutorials/advanced/date_time_charts.py @@ -124,6 +124,13 @@ ) fig.show() +############################################################################### +# +# PyGMT doesn't recognize non-ISO datetime strings like "Jun 05, 2018". If your +# data contain non-ISO datetime strings, you can convert them to a recognized +# format using :func:`pandas.to_datetime` and then pass to PyGMT. +# + ############################################################################### # Mixing and matching Python ``datetime`` and ISO dates # ----------------------------------------------------- From 05c8b9384b6970e665ac1a8131f4a03b4ca053f4 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Thu, 6 Apr 2023 16:35:32 +0800 Subject: [PATCH 6/7] Fix typos Co-authored-by: Michael Grund <23025878+michaelgrund@users.noreply.github.com> --- pygmt/clib/conversion.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygmt/clib/conversion.py b/pygmt/clib/conversion.py index a3b6b56a776..6f98e00c4f1 100644 --- a/pygmt/clib/conversion.py +++ b/pygmt/clib/conversion.py @@ -251,7 +251,7 @@ def kwargs_to_ctypes_array(argument, kwargs, dtype): def array_to_datetime(array): """ - Convert n 1-D datetime array from various types into numpy.datetime64. + Convert a 1-D datetime array from various types into numpy.datetime64. If the input array is not in legal datetime formats, raise a ValueError exception. From 7c3c866565dcbd49565be56d40002c76c7a0cf7f Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Thu, 6 Apr 2023 17:46:21 +0800 Subject: [PATCH 7/7] Update examples/tutorials/advanced/date_time_charts.py Co-authored-by: Michael Grund <23025878+michaelgrund@users.noreply.github.com> --- examples/tutorials/advanced/date_time_charts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tutorials/advanced/date_time_charts.py b/examples/tutorials/advanced/date_time_charts.py index 33fb9b554d3..cef14479b85 100644 --- a/examples/tutorials/advanced/date_time_charts.py +++ b/examples/tutorials/advanced/date_time_charts.py @@ -128,7 +128,7 @@ # # PyGMT doesn't recognize non-ISO datetime strings like "Jun 05, 2018". If your # data contain non-ISO datetime strings, you can convert them to a recognized -# format using :func:`pandas.to_datetime` and then pass to PyGMT. +# format using :func:`pandas.to_datetime` and then pass it to PyGMT. # ###############################################################################