Skip to content

Commit 4df1821

Browse files
committed
BUG: use more generic type inference for fast plotting
xref pandas-dev#15073
1 parent c71f214 commit 4df1821

File tree

7 files changed

+71
-16
lines changed

7 files changed

+71
-16
lines changed

doc/source/whatsnew/v0.20.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ Other API Changes
248248
- ``pd.read_csv()`` will now issue a ``ParserWarning`` whenever there are conflicting values provided by the ``dialect`` parameter and the user (:issue:`14898`)
249249
- ``pd.read_csv()`` will now raise a ``ValueError`` for the C engine if the quote character is larger than than one byte (:issue:`11592`)
250250
- ``inplace`` arguments now require a boolean value, else a ``ValueError`` is thrown (:issue:`14189`)
251+
- ``pandas.api.types.is_datetime64_ns_dtype`` will now report ``True`` on a tz-aware dtype, similar to ``pandas.api.types.is_datetime64_any_dtype``
251252

252253
.. _whatsnew_0200.deprecations:
253254

pandas/tests/types/test_dtypes.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
is_datetime64tz_dtype, is_datetimetz,
1212
is_period_dtype, is_period,
1313
is_dtype_equal, is_datetime64_ns_dtype,
14-
is_datetime64_dtype, is_string_dtype,
14+
is_datetime64_dtype,
15+
is_datetime64_any_dtype, is_string_dtype,
1516
_coerce_to_dtype)
1617
import pandas.util.testing as tm
1718

@@ -132,8 +133,12 @@ def test_coerce_to_dtype(self):
132133
DatetimeTZDtype('ns', 'Asia/Tokyo'))
133134

134135
def test_compat(self):
135-
self.assertFalse(is_datetime64_ns_dtype(self.dtype))
136-
self.assertFalse(is_datetime64_ns_dtype('datetime64[ns, US/Eastern]'))
136+
self.assertTrue(is_datetime64tz_dtype(self.dtype))
137+
self.assertTrue(is_datetime64tz_dtype('datetime64[ns, US/Eastern]'))
138+
self.assertTrue(is_datetime64_any_dtype(self.dtype))
139+
self.assertTrue(is_datetime64_any_dtype('datetime64[ns, US/Eastern]'))
140+
self.assertTrue(is_datetime64_ns_dtype(self.dtype))
141+
self.assertTrue(is_datetime64_ns_dtype('datetime64[ns, US/Eastern]'))
137142
self.assertFalse(is_datetime64_dtype(self.dtype))
138143
self.assertFalse(is_datetime64_dtype('datetime64[ns, US/Eastern]'))
139144

pandas/tests/types/test_inference.py

+31
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
from pandas.types import inference
2323
from pandas.types.common import (is_timedelta64_dtype,
2424
is_timedelta64_ns_dtype,
25+
is_datetime64_dtype,
26+
is_datetime64_ns_dtype,
27+
is_datetime64_any_dtype,
28+
is_datetime64tz_dtype,
2529
is_number,
2630
is_integer,
2731
is_float,
@@ -805,6 +809,33 @@ def test_is_float(self):
805809
self.assertFalse(is_float(np.timedelta64(1, 'D')))
806810
self.assertFalse(is_float(Timedelta('1 days')))
807811

812+
def test_is_datetime_dtypes(self):
813+
814+
ts = pd.date_range('20130101', periods=3)
815+
tsa = pd.date_range('20130101', periods=3, tz='US/Eastern')
816+
817+
self.assertTrue(is_datetime64_dtype('datetime64'))
818+
self.assertTrue(is_datetime64_dtype('datetime64[ns]'))
819+
self.assertTrue(is_datetime64_dtype(ts))
820+
self.assertFalse(is_datetime64_dtype(tsa))
821+
822+
self.assertFalse(is_datetime64_ns_dtype('datetime64'))
823+
self.assertTrue(is_datetime64_ns_dtype('datetime64[ns]'))
824+
self.assertTrue(is_datetime64_ns_dtype(ts))
825+
self.assertTrue(is_datetime64_ns_dtype(tsa))
826+
827+
self.assertTrue(is_datetime64_any_dtype('datetime64'))
828+
self.assertTrue(is_datetime64_any_dtype('datetime64[ns]'))
829+
self.assertTrue(is_datetime64_any_dtype(ts))
830+
self.assertTrue(is_datetime64_any_dtype(tsa))
831+
832+
for tz in ['US/Eastern', 'UTC']:
833+
dtype = 'datetime64[ns, {}]'.format(tz)
834+
self.assertFalse(is_datetime64_dtype(dtype))
835+
self.assertTrue(is_datetime64tz_dtype(dtype))
836+
self.assertTrue(is_datetime64_ns_dtype(dtype))
837+
self.assertTrue(is_datetime64_any_dtype(dtype))
838+
808839
def test_is_timedelta(self):
809840
self.assertTrue(is_timedelta64_dtype('timedelta64'))
810841
self.assertTrue(is_timedelta64_dtype('timedelta64[ns]'))

pandas/tseries/tests/test_converter.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import nose
44

55
import numpy as np
6-
from pandas import Timestamp, Period
6+
from pandas import Timestamp, Period, Index
77
from pandas.compat import u
88
import pandas.util.testing as tm
9-
from pandas.tseries.offsets import Second, Milli, Micro
9+
from pandas.tseries.offsets import Second, Milli, Micro, Day
1010
from pandas.compat.numpy import np_datetime64_compat
1111

1212
try:
@@ -62,6 +62,21 @@ def test_conversion(self):
6262
np_datetime64_compat('2012-01-02 00:00:00+0000')]), None, None)
6363
self.assertEqual(rs[0], xp)
6464

65+
# we have a tz-aware date (constructed to that when we turn to utc it
66+
# is the same as our sample)
67+
ts = (Timestamp('2012-01-01')
68+
.tz_localize('UTC')
69+
.tz_convert('US/Eastern')
70+
)
71+
rs = self.dtc.convert(ts, None, None)
72+
self.assertEqual(rs, xp)
73+
74+
rs = self.dtc.convert(Index([ts - Day(1), ts]), None, None)
75+
self.assertEqual(rs[1], xp)
76+
77+
rs = self.dtc.convert(ts, None, None)
78+
self.assertEqual(rs, xp)
79+
6580
def test_conversion_float(self):
6681
decimals = 9
6782

pandas/tseries/tests/test_timeseries.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2404,7 +2404,7 @@ def test_to_datetime_tz_psycopg2(self):
24042404
i = pd.DatetimeIndex([
24052405
'2000-01-01 08:00:00+00:00'
24062406
], tz=psycopg2.tz.FixedOffsetTimezone(offset=-300, name=None))
2407-
self.assertFalse(is_datetime64_ns_dtype(i))
2407+
self.assertTrue(is_datetime64_ns_dtype(i))
24082408

24092409
# tz coerceion
24102410
result = pd.to_datetime(i, errors='coerce')

pandas/tseries/tools.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,14 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
309309
arg = np.array(arg, dtype='O')
310310

311311
# these are shortcutable
312-
if is_datetime64_ns_dtype(arg):
312+
if is_datetime64tz_dtype(arg):
313+
if not isinstance(arg, DatetimeIndex):
314+
return DatetimeIndex(arg, tz=tz, name=name)
315+
if utc:
316+
arg = arg.tz_convert(None).tz_localize('UTC')
317+
return arg
318+
319+
elif is_datetime64_ns_dtype(arg):
313320
if box and not isinstance(arg, DatetimeIndex):
314321
try:
315322
return DatetimeIndex(arg, tz=tz, name=name)
@@ -318,13 +325,6 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
318325

319326
return arg
320327

321-
elif is_datetime64tz_dtype(arg):
322-
if not isinstance(arg, DatetimeIndex):
323-
return DatetimeIndex(arg, tz=tz, name=name)
324-
if utc:
325-
arg = arg.tz_convert(None).tz_localize('UTC')
326-
return arg
327-
328328
elif unit is not None:
329329
if format is not None:
330330
raise ValueError("cannot specify both format and unit")

pandas/types/common.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,11 @@ def is_datetime64_ns_dtype(arr_or_dtype):
187187
try:
188188
tipo = _get_dtype(arr_or_dtype)
189189
except TypeError:
190-
return False
191-
return tipo == _NS_DTYPE
190+
if is_datetime64tz_dtype(arr_or_dtype):
191+
tipo = _get_dtype(arr_or_dtype.dtype)
192+
else:
193+
return False
194+
return tipo == _NS_DTYPE or getattr(tipo, 'base', None) == _NS_DTYPE
192195

193196

194197
def is_timedelta64_ns_dtype(arr_or_dtype):

0 commit comments

Comments
 (0)