Skip to content

Commit ab3d689

Browse files
seismanweiji14michaelgrund
authored
Use np.asarray to convert a 1-D array to datetime type in array_to_datetime (#2481)
Co-authored-by: Wei Ji <[email protected]> Co-authored-by: Michael Grund <[email protected]>
1 parent 3442e9e commit ab3d689

File tree

3 files changed

+33
-28
lines changed

3 files changed

+33
-28
lines changed

examples/tutorials/advanced/date_time_charts.py

+7
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,13 @@
124124
)
125125
fig.show()
126126

127+
###############################################################################
128+
#
129+
# PyGMT doesn't recognize non-ISO datetime strings like "Jun 05, 2018". If your
130+
# data contain non-ISO datetime strings, you can convert them to a recognized
131+
# format using :func:`pandas.to_datetime` and then pass it to PyGMT.
132+
#
133+
127134
###############################################################################
128135
# Mixing and matching Python ``datetime`` and ISO dates
129136
# -----------------------------------------------------

pygmt/clib/conversion.py

+25-27
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import warnings
55

66
import numpy as np
7-
import pandas as pd
87
from pygmt.exceptions import GMTInvalidInput
98

109

@@ -252,10 +251,9 @@ def kwargs_to_ctypes_array(argument, kwargs, dtype):
252251

253252
def array_to_datetime(array):
254253
"""
255-
Convert an 1-D datetime array from various types into pandas.DatetimeIndex
256-
(i.e., numpy.datetime64).
254+
Convert a 1-D datetime array from various types into numpy.datetime64.
257255
258-
If the input array is not in legal datetime formats, raise a "ParseError"
256+
If the input array is not in legal datetime formats, raise a ValueError
259257
exception.
260258
261259
Parameters
@@ -272,58 +270,58 @@ def array_to_datetime(array):
272270
273271
Returns
274272
-------
275-
array : 1-D datetime array in pandas.DatetimeIndex (i.e., numpy.datetime64)
273+
array : 1-D datetime array in numpy.datetime64
274+
275+
Raises
276+
------
277+
ValueError
278+
If the datetime string is invalid.
276279
277280
Examples
278281
--------
279282
>>> import datetime
280283
>>> # numpy.datetime64 array
281284
>>> x = np.array(
282285
... ["2010-06-01", "2011-06-01T12", "2012-01-01T12:34:56"],
283-
... dtype="datetime64",
286+
... dtype="datetime64[ns]",
284287
... )
285288
>>> array_to_datetime(x)
286-
DatetimeIndex(['2010-06-01 00:00:00', '2011-06-01 12:00:00',
287-
'2012-01-01 12:34:56'],
288-
dtype='datetime64[ns]', freq=None)
289+
array(['2010-06-01T00:00:00.000000000', '2011-06-01T12:00:00.000000000',
290+
'2012-01-01T12:34:56.000000000'], dtype='datetime64[ns]')
289291
290292
>>> # pandas.DateTimeIndex array
293+
>>> import pandas as pd
291294
>>> x = pd.date_range("2013", freq="YS", periods=3)
292-
>>> array_to_datetime(x) # doctest: +NORMALIZE_WHITESPACE
293-
DatetimeIndex(['2013-01-01', '2014-01-01', '2015-01-01'],
294-
dtype='datetime64[ns]', freq='AS-JAN')
295+
>>> array_to_datetime(x)
296+
array(['2013-01-01T00:00:00.000000000', '2014-01-01T00:00:00.000000000',
297+
'2015-01-01T00:00:00.000000000'], dtype='datetime64[ns]')
295298
296299
>>> # Python's built-in date and datetime
297300
>>> x = [datetime.date(2018, 1, 1), datetime.datetime(2019, 1, 1)]
298-
>>> array_to_datetime(x) # doctest: +NORMALIZE_WHITESPACE
299-
DatetimeIndex(['2018-01-01', '2019-01-01'],
300-
dtype='datetime64[ns]', freq=None)
301+
>>> array_to_datetime(x)
302+
array(['2018-01-01T00:00:00.000000', '2019-01-01T00:00:00.000000'],
303+
dtype='datetime64[us]')
301304
302305
>>> # Raw datetime strings in various format
303306
>>> x = [
304307
... "2018",
305308
... "2018-02",
306309
... "2018-03-01",
307310
... "2018-04-01T01:02:03",
308-
... "5/1/2018",
309-
... "Jun 05, 2018",
310-
... "2018/07/02",
311311
... ]
312312
>>> array_to_datetime(x)
313-
DatetimeIndex(['2018-01-01 00:00:00', '2018-02-01 00:00:00',
314-
'2018-03-01 00:00:00', '2018-04-01 01:02:03',
315-
'2018-05-01 00:00:00', '2018-06-05 00:00:00',
316-
'2018-07-02 00:00:00'],
317-
dtype='datetime64[ns]', freq=None)
313+
array(['2018-01-01T00:00:00', '2018-02-01T00:00:00',
314+
'2018-03-01T00:00:00', '2018-04-01T01:02:03'],
315+
dtype='datetime64[s]')
318316
319317
>>> # Mixed datetime types
320318
>>> x = [
321319
... "2018-01-01",
322320
... np.datetime64("2018-01-01"),
323321
... datetime.datetime(2018, 1, 1),
324322
... ]
325-
>>> array_to_datetime(x) # doctest: +NORMALIZE_WHITESPACE
326-
DatetimeIndex(['2018-01-01', '2018-01-01', '2018-01-01'],
327-
dtype='datetime64[ns]', freq=None)
323+
>>> array_to_datetime(x)
324+
array(['2018-01-01T00:00:00.000000', '2018-01-01T00:00:00.000000',
325+
'2018-01-01T00:00:00.000000'], dtype='datetime64[us]')
328326
"""
329-
return pd.to_datetime(array)
327+
return np.asarray(array, dtype=np.datetime64)

pygmt/clib/session.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ def _check_dtype_and_dim(self, array, ndim):
745745
if array.dtype.type not in DTYPES:
746746
try:
747747
# Try to convert any unknown numpy data types to np.datetime64
748-
array = np.asarray(array, dtype=np.datetime64)
748+
array = array_to_datetime(array)
749749
except ValueError as e:
750750
raise GMTInvalidInput(
751751
f"Unsupported numpy data type '{array.dtype.type}'."

0 commit comments

Comments
 (0)