Skip to content

Commit 40b4bb4

Browse files
committed
TST: reorg datetime with tz tests a bit
Author: Jeff Reback <[email protected]> Closes #13301 from jreback/ts2 and squashes the following commits: 2d8fbd4 [Jeff Reback] TST: reorg tests for datetime_with_tz construction
1 parent db43824 commit 40b4bb4

File tree

4 files changed

+223
-182
lines changed

4 files changed

+223
-182
lines changed

pandas/tests/frame/test_constructors.py

+37-182
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,14 @@
1717
from pandas.compat import (lmap, long, zip, range, lrange, lzip,
1818
OrderedDict, is_platform_little_endian)
1919
from pandas import compat
20-
from pandas import (DataFrame, Index, Series, notnull, isnull,
20+
from pandas import (DataFrame, Index, Series, isnull,
2121
MultiIndex, Timedelta, Timestamp,
2222
date_range)
2323
from pandas.core.common import PandasError
2424
import pandas as pd
2525
import pandas.core.common as com
2626
import pandas.lib as lib
2727

28-
from pandas.types.api import DatetimeTZDtype
29-
3028
from pandas.util.testing import (assert_numpy_array_equal,
3129
assert_series_equal,
3230
assert_frame_equal,
@@ -1329,185 +1327,6 @@ def test_constructor_with_datetimes(self):
13291327
.reset_index(drop=True), 'b': i_no_tz})
13301328
assert_frame_equal(df, expected)
13311329

1332-
def test_constructor_with_datetime_tz(self):
1333-
1334-
# 8260
1335-
# support datetime64 with tz
1336-
1337-
idx = Index(date_range('20130101', periods=3, tz='US/Eastern'),
1338-
name='foo')
1339-
dr = date_range('20130110', periods=3)
1340-
1341-
# construction
1342-
df = DataFrame({'A': idx, 'B': dr})
1343-
self.assertTrue(df['A'].dtype, 'M8[ns, US/Eastern')
1344-
self.assertTrue(df['A'].name == 'A')
1345-
assert_series_equal(df['A'], Series(idx, name='A'))
1346-
assert_series_equal(df['B'], Series(dr, name='B'))
1347-
1348-
# construction from dict
1349-
df2 = DataFrame(dict(A=Timestamp('20130102', tz='US/Eastern'),
1350-
B=Timestamp('20130603', tz='CET')),
1351-
index=range(5))
1352-
assert_series_equal(df2.dtypes, Series(['datetime64[ns, US/Eastern]',
1353-
'datetime64[ns, CET]'],
1354-
index=['A', 'B']))
1355-
1356-
# dtypes
1357-
tzframe = DataFrame({'A': date_range('20130101', periods=3),
1358-
'B': date_range('20130101', periods=3,
1359-
tz='US/Eastern'),
1360-
'C': date_range('20130101', periods=3, tz='CET')})
1361-
tzframe.iloc[1, 1] = pd.NaT
1362-
tzframe.iloc[1, 2] = pd.NaT
1363-
result = tzframe.dtypes.sort_index()
1364-
expected = Series([np.dtype('datetime64[ns]'),
1365-
DatetimeTZDtype('datetime64[ns, US/Eastern]'),
1366-
DatetimeTZDtype('datetime64[ns, CET]')],
1367-
['A', 'B', 'C'])
1368-
1369-
# concat
1370-
df3 = pd.concat([df2.A.to_frame(), df2.B.to_frame()], axis=1)
1371-
assert_frame_equal(df2, df3)
1372-
1373-
# select_dtypes
1374-
result = df3.select_dtypes(include=['datetime64[ns]'])
1375-
expected = df3.reindex(columns=[])
1376-
assert_frame_equal(result, expected)
1377-
1378-
# this will select based on issubclass, and these are the same class
1379-
result = df3.select_dtypes(include=['datetime64[ns, CET]'])
1380-
expected = df3
1381-
assert_frame_equal(result, expected)
1382-
1383-
# from index
1384-
idx2 = date_range('20130101', periods=3, tz='US/Eastern', name='foo')
1385-
df2 = DataFrame(idx2)
1386-
assert_series_equal(df2['foo'], Series(idx2, name='foo'))
1387-
df2 = DataFrame(Series(idx2))
1388-
assert_series_equal(df2['foo'], Series(idx2, name='foo'))
1389-
1390-
idx2 = date_range('20130101', periods=3, tz='US/Eastern')
1391-
df2 = DataFrame(idx2)
1392-
assert_series_equal(df2[0], Series(idx2, name=0))
1393-
df2 = DataFrame(Series(idx2))
1394-
assert_series_equal(df2[0], Series(idx2, name=0))
1395-
1396-
# interleave with object
1397-
result = self.tzframe.assign(D='foo').values
1398-
expected = np.array([[Timestamp('2013-01-01 00:00:00'),
1399-
Timestamp('2013-01-02 00:00:00'),
1400-
Timestamp('2013-01-03 00:00:00')],
1401-
[Timestamp('2013-01-01 00:00:00-0500',
1402-
tz='US/Eastern'),
1403-
pd.NaT,
1404-
Timestamp('2013-01-03 00:00:00-0500',
1405-
tz='US/Eastern')],
1406-
[Timestamp('2013-01-01 00:00:00+0100', tz='CET'),
1407-
pd.NaT,
1408-
Timestamp('2013-01-03 00:00:00+0100', tz='CET')],
1409-
['foo', 'foo', 'foo']], dtype=object).T
1410-
self.assert_numpy_array_equal(result, expected)
1411-
1412-
# interleave with only datetime64[ns]
1413-
result = self.tzframe.values
1414-
expected = np.array([[Timestamp('2013-01-01 00:00:00'),
1415-
Timestamp('2013-01-02 00:00:00'),
1416-
Timestamp('2013-01-03 00:00:00')],
1417-
[Timestamp('2013-01-01 00:00:00-0500',
1418-
tz='US/Eastern'),
1419-
pd.NaT,
1420-
Timestamp('2013-01-03 00:00:00-0500',
1421-
tz='US/Eastern')],
1422-
[Timestamp('2013-01-01 00:00:00+0100', tz='CET'),
1423-
pd.NaT,
1424-
Timestamp('2013-01-03 00:00:00+0100',
1425-
tz='CET')]], dtype=object).T
1426-
self.assert_numpy_array_equal(result, expected)
1427-
1428-
# astype
1429-
expected = np.array([[Timestamp('2013-01-01 00:00:00'),
1430-
Timestamp('2013-01-02 00:00:00'),
1431-
Timestamp('2013-01-03 00:00:00')],
1432-
[Timestamp('2013-01-01 00:00:00-0500',
1433-
tz='US/Eastern'),
1434-
pd.NaT,
1435-
Timestamp('2013-01-03 00:00:00-0500',
1436-
tz='US/Eastern')],
1437-
[Timestamp('2013-01-01 00:00:00+0100', tz='CET'),
1438-
pd.NaT,
1439-
Timestamp('2013-01-03 00:00:00+0100',
1440-
tz='CET')]],
1441-
dtype=object).T
1442-
result = self.tzframe.astype(object)
1443-
assert_frame_equal(result, DataFrame(
1444-
expected, index=self.tzframe.index, columns=self.tzframe.columns))
1445-
1446-
result = self.tzframe.astype('datetime64[ns]')
1447-
expected = DataFrame({'A': date_range('20130101', periods=3),
1448-
'B': (date_range('20130101', periods=3,
1449-
tz='US/Eastern')
1450-
.tz_convert('UTC')
1451-
.tz_localize(None)),
1452-
'C': (date_range('20130101', periods=3,
1453-
tz='CET')
1454-
.tz_convert('UTC')
1455-
.tz_localize(None))})
1456-
expected.iloc[1, 1] = pd.NaT
1457-
expected.iloc[1, 2] = pd.NaT
1458-
assert_frame_equal(result, expected)
1459-
1460-
# str formatting
1461-
result = self.tzframe.astype(str)
1462-
expected = np.array([['2013-01-01', '2013-01-01 00:00:00-05:00',
1463-
'2013-01-01 00:00:00+01:00'],
1464-
['2013-01-02', 'NaT', 'NaT'],
1465-
['2013-01-03', '2013-01-03 00:00:00-05:00',
1466-
'2013-01-03 00:00:00+01:00']], dtype=object)
1467-
self.assert_numpy_array_equal(result, expected)
1468-
1469-
result = str(self.tzframe)
1470-
self.assertTrue('0 2013-01-01 2013-01-01 00:00:00-05:00 '
1471-
'2013-01-01 00:00:00+01:00' in result)
1472-
self.assertTrue('1 2013-01-02 '
1473-
'NaT NaT' in result)
1474-
self.assertTrue('2 2013-01-03 2013-01-03 00:00:00-05:00 '
1475-
'2013-01-03 00:00:00+01:00' in result)
1476-
1477-
# setitem
1478-
df['C'] = idx
1479-
assert_series_equal(df['C'], Series(idx, name='C'))
1480-
1481-
df['D'] = 'foo'
1482-
df['D'] = idx
1483-
assert_series_equal(df['D'], Series(idx, name='D'))
1484-
del df['D']
1485-
1486-
# assert that A & C are not sharing the same base (e.g. they
1487-
# are copies)
1488-
b1 = df._data.blocks[1]
1489-
b2 = df._data.blocks[2]
1490-
self.assertTrue(b1.values.equals(b2.values))
1491-
self.assertFalse(id(b1.values.values.base) ==
1492-
id(b2.values.values.base))
1493-
1494-
# with nan
1495-
df2 = df.copy()
1496-
df2.iloc[1, 1] = pd.NaT
1497-
df2.iloc[1, 2] = pd.NaT
1498-
result = df2['B']
1499-
assert_series_equal(notnull(result), Series(
1500-
[True, False, True], name='B'))
1501-
assert_series_equal(df2.dtypes, df.dtypes)
1502-
1503-
# set/reset
1504-
df = DataFrame({'A': [0, 1, 2]}, index=idx)
1505-
result = df.reset_index()
1506-
self.assertTrue(result['foo'].dtype, 'M8[ns, US/Eastern')
1507-
1508-
result = result.set_index('foo')
1509-
tm.assert_index_equal(df.index, idx)
1510-
15111330
def test_constructor_for_list_with_dtypes(self):
15121331
# TODO(wesm): unused
15131332
intname = np.dtype(np.int_).name # noqa
@@ -2018,3 +1837,39 @@ def test_from_records_len0_with_columns(self):
20181837
self.assertTrue(np.array_equal(result.columns, ['bar']))
20191838
self.assertEqual(len(result), 0)
20201839
self.assertEqual(result.index.name, 'foo')
1840+
1841+
1842+
class TestDataFrameConstructorWithDatetimeTZ(tm.TestCase, TestData):
1843+
1844+
_multiprocess_can_split_ = True
1845+
1846+
def test_from_dict(self):
1847+
1848+
# 8260
1849+
# support datetime64 with tz
1850+
1851+
idx = Index(date_range('20130101', periods=3, tz='US/Eastern'),
1852+
name='foo')
1853+
dr = date_range('20130110', periods=3)
1854+
1855+
# construction
1856+
df = DataFrame({'A': idx, 'B': dr})
1857+
self.assertTrue(df['A'].dtype, 'M8[ns, US/Eastern')
1858+
self.assertTrue(df['A'].name == 'A')
1859+
assert_series_equal(df['A'], Series(idx, name='A'))
1860+
assert_series_equal(df['B'], Series(dr, name='B'))
1861+
1862+
def test_from_index(self):
1863+
1864+
# from index
1865+
idx2 = date_range('20130101', periods=3, tz='US/Eastern', name='foo')
1866+
df2 = DataFrame(idx2)
1867+
assert_series_equal(df2['foo'], Series(idx2, name='foo'))
1868+
df2 = DataFrame(Series(idx2))
1869+
assert_series_equal(df2['foo'], Series(idx2, name='foo'))
1870+
1871+
idx2 = date_range('20130101', periods=3, tz='US/Eastern')
1872+
df2 = DataFrame(idx2)
1873+
assert_series_equal(df2[0], Series(idx2, name=0))
1874+
df2 = DataFrame(Series(idx2))
1875+
assert_series_equal(df2[0], Series(idx2, name=0))

pandas/tests/frame/test_dtypes.py

+116
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from pandas import (DataFrame, Series, date_range, Timedelta, Timestamp,
1010
compat, option_context)
1111
from pandas.compat import u
12+
from pandas.core import common as com
1213
from pandas.tests.frame.common import TestData
1314
from pandas.util.testing import (assert_series_equal,
1415
assert_frame_equal,
@@ -74,6 +75,21 @@ def test_empty_frame_dtypes_ftypes(self):
7475
assert_series_equal(df[:0].dtypes, ex_dtypes)
7576
assert_series_equal(df[:0].ftypes, ex_ftypes)
7677

78+
def test_datetime_with_tz_dtypes(self):
79+
tzframe = DataFrame({'A': date_range('20130101', periods=3),
80+
'B': date_range('20130101', periods=3,
81+
tz='US/Eastern'),
82+
'C': date_range('20130101', periods=3, tz='CET')})
83+
tzframe.iloc[1, 1] = pd.NaT
84+
tzframe.iloc[1, 2] = pd.NaT
85+
result = tzframe.dtypes.sort_index()
86+
expected = Series([np.dtype('datetime64[ns]'),
87+
com.DatetimeTZDtype('datetime64[ns, US/Eastern]'),
88+
com.DatetimeTZDtype('datetime64[ns, CET]')],
89+
['A', 'B', 'C'])
90+
91+
assert_series_equal(result, expected)
92+
7793
def test_dtypes_are_correct_after_column_slice(self):
7894
# GH6525
7995
df = pd.DataFrame(index=range(5), columns=list("abc"), dtype=np.float_)
@@ -178,6 +194,16 @@ def test_select_dtypes_bad_datetime64(self):
178194
with tm.assertRaisesRegexp(ValueError, '.+ is too specific'):
179195
df.select_dtypes(exclude=['datetime64[as]'])
180196

197+
def test_select_dtypes_datetime_with_tz(self):
198+
199+
df2 = DataFrame(dict(A=Timestamp('20130102', tz='US/Eastern'),
200+
B=Timestamp('20130603', tz='CET')),
201+
index=range(5))
202+
df3 = pd.concat([df2.A.to_frame(), df2.B.to_frame()], axis=1)
203+
result = df3.select_dtypes(include=['datetime64[ns]'])
204+
expected = df3.reindex(columns=[])
205+
assert_frame_equal(result, expected)
206+
181207
def test_select_dtypes_str_raises(self):
182208
df = DataFrame({'a': list('abc'),
183209
'g': list(u('abc')),
@@ -394,3 +420,93 @@ def test_timedeltas(self):
394420
'int64': 1}).sort_values()
395421
result = df.get_dtype_counts().sort_values()
396422
assert_series_equal(result, expected)
423+
424+
425+
class TestDataFrameDatetimeWithTZ(tm.TestCase, TestData):
426+
427+
_multiprocess_can_split_ = True
428+
429+
def test_interleave(self):
430+
431+
# interleave with object
432+
result = self.tzframe.assign(D='foo').values
433+
expected = np.array([[Timestamp('2013-01-01 00:00:00'),
434+
Timestamp('2013-01-02 00:00:00'),
435+
Timestamp('2013-01-03 00:00:00')],
436+
[Timestamp('2013-01-01 00:00:00-0500',
437+
tz='US/Eastern'),
438+
pd.NaT,
439+
Timestamp('2013-01-03 00:00:00-0500',
440+
tz='US/Eastern')],
441+
[Timestamp('2013-01-01 00:00:00+0100', tz='CET'),
442+
pd.NaT,
443+
Timestamp('2013-01-03 00:00:00+0100', tz='CET')],
444+
['foo', 'foo', 'foo']], dtype=object).T
445+
self.assert_numpy_array_equal(result, expected)
446+
447+
# interleave with only datetime64[ns]
448+
result = self.tzframe.values
449+
expected = np.array([[Timestamp('2013-01-01 00:00:00'),
450+
Timestamp('2013-01-02 00:00:00'),
451+
Timestamp('2013-01-03 00:00:00')],
452+
[Timestamp('2013-01-01 00:00:00-0500',
453+
tz='US/Eastern'),
454+
pd.NaT,
455+
Timestamp('2013-01-03 00:00:00-0500',
456+
tz='US/Eastern')],
457+
[Timestamp('2013-01-01 00:00:00+0100', tz='CET'),
458+
pd.NaT,
459+
Timestamp('2013-01-03 00:00:00+0100',
460+
tz='CET')]], dtype=object).T
461+
self.assert_numpy_array_equal(result, expected)
462+
463+
def test_astype(self):
464+
# astype
465+
expected = np.array([[Timestamp('2013-01-01 00:00:00'),
466+
Timestamp('2013-01-02 00:00:00'),
467+
Timestamp('2013-01-03 00:00:00')],
468+
[Timestamp('2013-01-01 00:00:00-0500',
469+
tz='US/Eastern'),
470+
pd.NaT,
471+
Timestamp('2013-01-03 00:00:00-0500',
472+
tz='US/Eastern')],
473+
[Timestamp('2013-01-01 00:00:00+0100', tz='CET'),
474+
pd.NaT,
475+
Timestamp('2013-01-03 00:00:00+0100',
476+
tz='CET')]],
477+
dtype=object).T
478+
result = self.tzframe.astype(object)
479+
assert_frame_equal(result, DataFrame(
480+
expected, index=self.tzframe.index, columns=self.tzframe.columns))
481+
482+
result = self.tzframe.astype('datetime64[ns]')
483+
expected = DataFrame({'A': date_range('20130101', periods=3),
484+
'B': (date_range('20130101', periods=3,
485+
tz='US/Eastern')
486+
.tz_convert('UTC')
487+
.tz_localize(None)),
488+
'C': (date_range('20130101', periods=3,
489+
tz='CET')
490+
.tz_convert('UTC')
491+
.tz_localize(None))})
492+
expected.iloc[1, 1] = pd.NaT
493+
expected.iloc[1, 2] = pd.NaT
494+
assert_frame_equal(result, expected)
495+
496+
def test_astype_str(self):
497+
# str formatting
498+
result = self.tzframe.astype(str)
499+
expected = np.array([['2013-01-01', '2013-01-01 00:00:00-05:00',
500+
'2013-01-01 00:00:00+01:00'],
501+
['2013-01-02', 'NaT', 'NaT'],
502+
['2013-01-03', '2013-01-03 00:00:00-05:00',
503+
'2013-01-03 00:00:00+01:00']], dtype=object)
504+
self.assert_numpy_array_equal(result, expected)
505+
506+
result = str(self.tzframe)
507+
self.assertTrue('0 2013-01-01 2013-01-01 00:00:00-05:00 '
508+
'2013-01-01 00:00:00+01:00' in result)
509+
self.assertTrue('1 2013-01-02 '
510+
'NaT NaT' in result)
511+
self.assertTrue('2 2013-01-03 2013-01-03 00:00:00-05:00 '
512+
'2013-01-03 00:00:00+01:00' in result)

0 commit comments

Comments
 (0)