Skip to content

Commit 1f08bb0

Browse files
committed
ENH: select_dtypes now allows 'datetimetz' for generically selecting datetimes with timezones
1 parent a718962 commit 1f08bb0

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-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

+4
Original file line numberDiff line numberDiff line change
@@ -2257,7 +2257,11 @@ 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 'timedelta64'
22602262
* To select Pandas categorical dtypes, use 'category'
2263+
* To select Pandas datetimetz dtypes, use 'datetimetz' (new in 0.20.0),
2264+
or a 'datetime64[ns, tz]' string
22612265
22622266
Examples
22632267
--------

pandas/tests/frame/test_dtypes.py

+33-2
Original file line numberDiff line numberDiff line change
@@ -109,15 +109,46 @@ 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'], exclude=['timedelta'])
118131
ei = df[['b', 'c', 'd', 'f']]
119132
assert_frame_equal(ri, ei)
120133

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

pandas/types/common.py

+5
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,11 @@ def _get_dtype_from_object(dtype):
403403
pass
404404
return dtype.type
405405
elif isinstance(dtype, string_types):
406+
if dtype in ['datetimetz', 'datetime64tz']:
407+
return DatetimeTZDtype.type
408+
elif dtype in ['period']:
409+
raise NotImplementedError
410+
406411
if dtype == 'datetime' or dtype == 'timedelta':
407412
dtype += '64'
408413

0 commit comments

Comments
 (0)