Skip to content

Commit 8b98104

Browse files
authored
ENH: select_dtypes now allows 'datetimetz' for generically selecting datetimes with timezones (pandas-dev#14910)
1 parent f1cfe5b commit 8b98104

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

doc/source/whatsnew/v0.20.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ Other enhancements
106106
- ``pd.Series.interpolate`` now supports timedelta as an index type with ``method='time'`` (:issue:`6424`)
107107
- ``pandas.io.json.json_normalize()`` gained the option ``errors='ignore'|'raise'``; the default is ``errors='raise'`` which is backward compatible. (:issue:`14583`)
108108

109+
- ``.select_dtypes()`` now allows `datetimetz` to generically select datetimes with tz (:issue:`14910`)
109110

110111
.. _whatsnew_0200.api_breaking:
111112

@@ -249,5 +250,4 @@ Bug Fixes
249250

250251

251252

252-
253253
- Require at least 0.23 version of cython to avoid problems with character encodings (:issue:`14699`)

pandas/core/frame.py

+5
Original file line numberDiff line numberDiff line change
@@ -2257,7 +2257,12 @@ def select_dtypes(self, include=None, exclude=None):
22572257
this will return *all* object dtype columns
22582258
* See the `numpy dtype hierarchy
22592259
<http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html>`__
2260+
* To select datetimes, use np.datetime64, 'datetime' or 'datetime64'
2261+
* To select timedeltas, use np.timedelta64, 'timedelta' or
2262+
'timedelta64'
22602263
* To select Pandas categorical dtypes, use 'category'
2264+
* To select Pandas datetimetz dtypes, use 'datetimetz' (new in 0.20.0),
2265+
or a 'datetime64[ns, tz]' string
22612266
22622267
Examples
22632268
--------

pandas/tests/frame/test_dtypes.py

+35-2
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,48 @@ def test_select_dtypes_include(self):
109109
'c': np.arange(3, 6).astype('u1'),
110110
'd': np.arange(4.0, 7.0, dtype='float64'),
111111
'e': [True, False, True],
112-
'f': pd.Categorical(list('abc'))})
112+
'f': pd.Categorical(list('abc')),
113+
'g': pd.date_range('20130101', periods=3),
114+
'h': pd.date_range('20130101', periods=3,
115+
tz='US/Eastern'),
116+
'i': pd.date_range('20130101', periods=3,
117+
tz='CET'),
118+
'j': pd.period_range('2013-01', periods=3,
119+
freq='M'),
120+
'k': pd.timedelta_range('1 day', periods=3)})
121+
113122
ri = df.select_dtypes(include=[np.number])
123+
ei = df[['b', 'c', 'd', 'k']]
124+
assert_frame_equal(ri, ei)
125+
126+
ri = df.select_dtypes(include=[np.number], exclude=['timedelta'])
114127
ei = df[['b', 'c', 'd']]
115128
assert_frame_equal(ri, ei)
116129

117-
ri = df.select_dtypes(include=[np.number, 'category'])
130+
ri = df.select_dtypes(include=[np.number, 'category'],
131+
exclude=['timedelta'])
118132
ei = df[['b', 'c', 'd', 'f']]
119133
assert_frame_equal(ri, ei)
120134

135+
ri = df.select_dtypes(include=['datetime'])
136+
ei = df[['g']]
137+
assert_frame_equal(ri, ei)
138+
139+
ri = df.select_dtypes(include=['datetime64'])
140+
ei = df[['g']]
141+
assert_frame_equal(ri, ei)
142+
143+
ri = df.select_dtypes(include=['datetimetz'])
144+
ei = df[['h', 'i']]
145+
assert_frame_equal(ri, ei)
146+
147+
ri = df.select_dtypes(include=['timedelta'])
148+
ei = df[['k']]
149+
assert_frame_equal(ri, ei)
150+
151+
self.assertRaises(NotImplementedError,
152+
lambda: df.select_dtypes(include=['period']))
153+
121154
def test_select_dtypes_exclude(self):
122155
df = DataFrame({'a': list('abc'),
123156
'b': list(range(1, 4)),

pandas/types/common.py

+5
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,11 @@ def _get_dtype_from_object(dtype):
400400
pass
401401
return dtype.type
402402
elif isinstance(dtype, string_types):
403+
if dtype in ['datetimetz', 'datetime64tz']:
404+
return DatetimeTZDtype.type
405+
elif dtype in ['period']:
406+
raise NotImplementedError
407+
403408
if dtype == 'datetime' or dtype == 'timedelta':
404409
dtype += '64'
405410

0 commit comments

Comments
 (0)