Skip to content

Commit 055bfa6

Browse files
jbrockmendeljreback
authored andcommitted
Followup Cleanup DTI test_arithmetic, ASV (pandas-dev#19149)
1 parent 8badfd5 commit 055bfa6

File tree

3 files changed

+180
-158
lines changed

3 files changed

+180
-158
lines changed

asv_bench/benchmarks/timestamp.py

-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,6 @@ def setup(self, tz, freq):
4242
def time_tz(self, tz, freq):
4343
self.ts.tz
4444

45-
def time_offset(self, tz, freq):
46-
self.ts.offset
47-
4845
def time_dayofweek(self, tz, freq):
4946
self.ts.dayofweek
5047

pandas/tests/indexes/datetimes/test_arithmetic.py

+105-81
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,111 @@ def test_dti_with_offset_series(self, tz, names):
447447
tm.assert_series_equal(res3, expected_sub)
448448

449449

450+
@pytest.mark.parametrize('klass,assert_func', [
451+
(Series, tm.assert_series_equal),
452+
(DatetimeIndex, tm.assert_index_equal)])
453+
def test_dt64_with_offset_array(klass, assert_func):
454+
# GH#10699
455+
# array of offsets
456+
box = Series if klass is Series else pd.Index
457+
with tm.assert_produces_warning(PerformanceWarning):
458+
s = klass([Timestamp('2000-1-1'), Timestamp('2000-2-1')])
459+
result = s + box([pd.offsets.DateOffset(years=1),
460+
pd.offsets.MonthEnd()])
461+
exp = klass([Timestamp('2001-1-1'), Timestamp('2000-2-29')])
462+
assert_func(result, exp)
463+
464+
# same offset
465+
result = s + box([pd.offsets.DateOffset(years=1),
466+
pd.offsets.DateOffset(years=1)])
467+
exp = klass([Timestamp('2001-1-1'), Timestamp('2001-2-1')])
468+
assert_func(result, exp)
469+
470+
471+
@pytest.mark.parametrize('klass,assert_func', [
472+
(Series, tm.assert_series_equal),
473+
(DatetimeIndex, tm.assert_index_equal)])
474+
def test_dt64_with_DateOffsets_relativedelta(klass, assert_func):
475+
# GH#10699
476+
vec = klass([Timestamp('2000-01-05 00:15:00'),
477+
Timestamp('2000-01-31 00:23:00'),
478+
Timestamp('2000-01-01'),
479+
Timestamp('2000-03-31'),
480+
Timestamp('2000-02-29'),
481+
Timestamp('2000-12-31'),
482+
Timestamp('2000-05-15'),
483+
Timestamp('2001-06-15')])
484+
485+
# DateOffset relativedelta fastpath
486+
relative_kwargs = [('years', 2), ('months', 5), ('days', 3),
487+
('hours', 5), ('minutes', 10), ('seconds', 2),
488+
('microseconds', 5)]
489+
for i, kwd in enumerate(relative_kwargs):
490+
op = pd.DateOffset(**dict([kwd]))
491+
assert_func(klass([x + op for x in vec]), vec + op)
492+
assert_func(klass([x - op for x in vec]), vec - op)
493+
op = pd.DateOffset(**dict(relative_kwargs[:i + 1]))
494+
assert_func(klass([x + op for x in vec]), vec + op)
495+
assert_func(klass([x - op for x in vec]), vec - op)
496+
497+
498+
@pytest.mark.parametrize('cls_name', [
499+
'YearBegin', ('YearBegin', {'month': 5}),
500+
'YearEnd', ('YearEnd', {'month': 5}),
501+
'MonthBegin', 'MonthEnd',
502+
'SemiMonthEnd', 'SemiMonthBegin',
503+
'Week', ('Week', {'weekday': 3}),
504+
'BusinessDay', 'BDay', 'QuarterEnd', 'QuarterBegin',
505+
'CustomBusinessDay', 'CDay', 'CBMonthEnd',
506+
'CBMonthBegin', 'BMonthBegin', 'BMonthEnd',
507+
'BusinessHour', 'BYearBegin', 'BYearEnd',
508+
'BQuarterBegin', ('LastWeekOfMonth', {'weekday': 2}),
509+
('FY5253Quarter', {'qtr_with_extra_week': 1,
510+
'startingMonth': 1,
511+
'weekday': 2,
512+
'variation': 'nearest'}),
513+
('FY5253', {'weekday': 0, 'startingMonth': 2, 'variation': 'nearest'}),
514+
('WeekOfMonth', {'weekday': 2, 'week': 2}),
515+
'Easter', ('DateOffset', {'day': 4}),
516+
('DateOffset', {'month': 5})])
517+
@pytest.mark.parametrize('normalize', [True, False])
518+
@pytest.mark.parametrize('klass,assert_func', [
519+
(Series, tm.assert_series_equal),
520+
(DatetimeIndex, tm.assert_index_equal)])
521+
def test_dt64_with_DateOffsets(klass, assert_func, normalize, cls_name):
522+
# GH#10699
523+
# assert these are equal on a piecewise basis
524+
vec = klass([Timestamp('2000-01-05 00:15:00'),
525+
Timestamp('2000-01-31 00:23:00'),
526+
Timestamp('2000-01-01'),
527+
Timestamp('2000-03-31'),
528+
Timestamp('2000-02-29'),
529+
Timestamp('2000-12-31'),
530+
Timestamp('2000-05-15'),
531+
Timestamp('2001-06-15')])
532+
533+
if isinstance(cls_name, tuple):
534+
# If cls_name param is a tuple, then 2nd entry is kwargs for
535+
# the offset constructor
536+
cls_name, kwargs = cls_name
537+
else:
538+
kwargs = {}
539+
540+
offset_cls = getattr(pd.offsets, cls_name)
541+
542+
with warnings.catch_warnings(record=True):
543+
for n in [0, 5]:
544+
if (cls_name in ['WeekOfMonth', 'LastWeekOfMonth',
545+
'FY5253Quarter', 'FY5253'] and n == 0):
546+
# passing n = 0 is invalid for these offset classes
547+
continue
548+
549+
offset = offset_cls(n, normalize=normalize, **kwargs)
550+
assert_func(klass([x + offset for x in vec]), vec + offset)
551+
assert_func(klass([x - offset for x in vec]), vec - offset)
552+
assert_func(klass([offset + x for x in vec]), offset + vec)
553+
554+
450555
# GH 10699
451556
@pytest.mark.parametrize('klass,assert_func', zip([Series, DatetimeIndex],
452557
[tm.assert_series_equal,
@@ -480,84 +585,3 @@ def test_datetime64_with_DateOffset(klass, assert_func):
480585
Timestamp('2000-02-29', tz='US/Central')], name='a')
481586
assert_func(result, exp)
482587
assert_func(result2, exp)
483-
484-
# array of offsets - valid for Series only
485-
if klass is Series:
486-
with tm.assert_produces_warning(PerformanceWarning):
487-
s = klass([Timestamp('2000-1-1'), Timestamp('2000-2-1')])
488-
result = s + Series([pd.offsets.DateOffset(years=1),
489-
pd.offsets.MonthEnd()])
490-
exp = klass([Timestamp('2001-1-1'), Timestamp('2000-2-29')
491-
])
492-
assert_func(result, exp)
493-
494-
# same offset
495-
result = s + Series([pd.offsets.DateOffset(years=1),
496-
pd.offsets.DateOffset(years=1)])
497-
exp = klass([Timestamp('2001-1-1'), Timestamp('2001-2-1')])
498-
assert_func(result, exp)
499-
500-
s = klass([Timestamp('2000-01-05 00:15:00'),
501-
Timestamp('2000-01-31 00:23:00'),
502-
Timestamp('2000-01-01'),
503-
Timestamp('2000-03-31'),
504-
Timestamp('2000-02-29'),
505-
Timestamp('2000-12-31'),
506-
Timestamp('2000-05-15'),
507-
Timestamp('2001-06-15')])
508-
509-
# DateOffset relativedelta fastpath
510-
relative_kwargs = [('years', 2), ('months', 5), ('days', 3),
511-
('hours', 5), ('minutes', 10), ('seconds', 2),
512-
('microseconds', 5)]
513-
for i, kwd in enumerate(relative_kwargs):
514-
op = pd.DateOffset(**dict([kwd]))
515-
assert_func(klass([x + op for x in s]), s + op)
516-
assert_func(klass([x - op for x in s]), s - op)
517-
op = pd.DateOffset(**dict(relative_kwargs[:i + 1]))
518-
assert_func(klass([x + op for x in s]), s + op)
519-
assert_func(klass([x - op for x in s]), s - op)
520-
521-
# assert these are equal on a piecewise basis
522-
offsets = ['YearBegin', ('YearBegin', {'month': 5}),
523-
'YearEnd', ('YearEnd', {'month': 5}),
524-
'MonthBegin', 'MonthEnd',
525-
'SemiMonthEnd', 'SemiMonthBegin',
526-
'Week', ('Week', {'weekday': 3}),
527-
'BusinessDay', 'BDay', 'QuarterEnd', 'QuarterBegin',
528-
'CustomBusinessDay', 'CDay', 'CBMonthEnd',
529-
'CBMonthBegin', 'BMonthBegin', 'BMonthEnd',
530-
'BusinessHour', 'BYearBegin', 'BYearEnd',
531-
'BQuarterBegin', ('LastWeekOfMonth', {'weekday': 2}),
532-
('FY5253Quarter', {'qtr_with_extra_week': 1,
533-
'startingMonth': 1,
534-
'weekday': 2,
535-
'variation': 'nearest'}),
536-
('FY5253', {'weekday': 0,
537-
'startingMonth': 2,
538-
'variation':
539-
'nearest'}),
540-
('WeekOfMonth', {'weekday': 2,
541-
'week': 2}),
542-
'Easter', ('DateOffset', {'day': 4}),
543-
('DateOffset', {'month': 5})]
544-
545-
with warnings.catch_warnings(record=True):
546-
for normalize in (True, False):
547-
for do in offsets:
548-
if isinstance(do, tuple):
549-
do, kwargs = do
550-
else:
551-
do = do
552-
kwargs = {}
553-
554-
for n in [0, 5]:
555-
if (do in ['WeekOfMonth', 'LastWeekOfMonth',
556-
'FY5253Quarter', 'FY5253'] and n == 0):
557-
continue
558-
op = getattr(pd.offsets, do)(n,
559-
normalize=normalize,
560-
**kwargs)
561-
assert_func(klass([x + op for x in s]), s + op)
562-
assert_func(klass([x - op for x in s]), s - op)
563-
assert_func(klass([op + x for x in s]), op + s)

pandas/tests/series/test_operators.py

+75-74
Original file line numberDiff line numberDiff line change
@@ -1005,9 +1005,7 @@ def test_operators_timedelta64_with_timedelta_invalid(self, scalar_td):
10051005

10061006
@pytest.mark.parametrize('scalar_td', [
10071007
timedelta(minutes=5, seconds=4),
1008-
pytest.param(Timedelta('5m4s'),
1009-
marks=pytest.mark.xfail(reason="Timedelta.__floordiv__ "
1010-
"bug GH#18846")),
1008+
Timedelta('5m4s'),
10111009
Timedelta('5m4s').to_timedelta64()])
10121010
def test_timedelta_rfloordiv(self, scalar_td):
10131011
# GH#18831
@@ -1381,21 +1379,23 @@ def test_datetime64_ops_nat(self):
13811379
assert_series_equal(NaT + nat_series_dtype_timestamp,
13821380
nat_series_dtype_timestamp)
13831381

1382+
@pytest.mark.parametrize('dt64_series', [
1383+
Series([Timestamp('19900315'), Timestamp('19900315')]),
1384+
Series([NaT, Timestamp('19900315')]),
1385+
Series([NaT, NaT], dtype='datetime64[ns]')])
1386+
@pytest.mark.parametrize('one', [1, 1.0, np.array(1)])
1387+
def test_dt64_mul_div_numeric_invalid(self, one, dt64_series):
13841388
# multiplication
13851389
with pytest.raises(TypeError):
1386-
datetime_series * 1
1387-
with pytest.raises(TypeError):
1388-
nat_series_dtype_timestamp * 1
1390+
dt64_series * one
13891391
with pytest.raises(TypeError):
1390-
datetime_series * 1.0
1391-
with pytest.raises(TypeError):
1392-
nat_series_dtype_timestamp * 1.0
1392+
one * dt64_series
13931393

13941394
# division
13951395
with pytest.raises(TypeError):
1396-
nat_series_dtype_timestamp / 1.0
1396+
dt64_series / one
13971397
with pytest.raises(TypeError):
1398-
nat_series_dtype_timestamp / 1
1398+
one / dt64_series
13991399

14001400
def test_dt64series_arith_overflow(self):
14011401
# GH#12534, fixed by #19024
@@ -1574,6 +1574,7 @@ def test_timedelta64_conversions(self):
15741574
expected = s1.apply(
15751575
lambda x: Timedelta(np.timedelta64(m, unit)) / x)
15761576
result = np.timedelta64(m, unit) / s1
1577+
assert_series_equal(result, expected)
15771578

15781579
# astype
15791580
s = Series(date_range('20130101', periods=3))
@@ -1990,69 +1991,69 @@ def test_series_frame_radd_bug(self):
19901991
with pytest.raises(TypeError):
19911992
self.ts + datetime.now()
19921993

1993-
def test_series_radd_more(self):
1994-
data = [[1, 2, 3],
1995-
[1.1, 2.2, 3.3],
1996-
[pd.Timestamp('2011-01-01'), pd.Timestamp('2011-01-02'),
1997-
pd.NaT],
1998-
['x', 'y', 1]]
1999-
2000-
for d in data:
2001-
for dtype in [None, object]:
2002-
s = Series(d, dtype=dtype)
2003-
with pytest.raises(TypeError):
2004-
'foo_' + s
2005-
2006-
for dtype in [None, object]:
2007-
res = 1 + pd.Series([1, 2, 3], dtype=dtype)
2008-
exp = pd.Series([2, 3, 4], dtype=dtype)
2009-
assert_series_equal(res, exp)
2010-
res = pd.Series([1, 2, 3], dtype=dtype) + 1
2011-
assert_series_equal(res, exp)
2012-
2013-
res = np.nan + pd.Series([1, 2, 3], dtype=dtype)
2014-
exp = pd.Series([np.nan, np.nan, np.nan], dtype=dtype)
2015-
assert_series_equal(res, exp)
2016-
res = pd.Series([1, 2, 3], dtype=dtype) + np.nan
2017-
assert_series_equal(res, exp)
2018-
2019-
s = pd.Series([pd.Timedelta('1 days'), pd.Timedelta('2 days'),
2020-
pd.Timedelta('3 days')], dtype=dtype)
2021-
exp = pd.Series([pd.Timedelta('4 days'), pd.Timedelta('5 days'),
2022-
pd.Timedelta('6 days')])
2023-
assert_series_equal(pd.Timedelta('3 days') + s, exp)
2024-
assert_series_equal(s + pd.Timedelta('3 days'), exp)
2025-
2026-
s = pd.Series(['x', np.nan, 'x'])
2027-
assert_series_equal('a' + s, pd.Series(['ax', np.nan, 'ax']))
2028-
assert_series_equal(s + 'a', pd.Series(['xa', np.nan, 'xa']))
2029-
2030-
def test_frame_radd_more(self):
2031-
data = [[1, 2, 3],
2032-
[1.1, 2.2, 3.3],
2033-
[pd.Timestamp('2011-01-01'), pd.Timestamp('2011-01-02'),
2034-
pd.NaT],
2035-
['x', 'y', 1]]
2036-
2037-
for d in data:
2038-
for dtype in [None, object]:
2039-
s = DataFrame(d, dtype=dtype)
2040-
with pytest.raises(TypeError):
2041-
'foo_' + s
2042-
2043-
for dtype in [None, object]:
2044-
res = 1 + pd.DataFrame([1, 2, 3], dtype=dtype)
2045-
exp = pd.DataFrame([2, 3, 4], dtype=dtype)
2046-
assert_frame_equal(res, exp)
2047-
res = pd.DataFrame([1, 2, 3], dtype=dtype) + 1
2048-
assert_frame_equal(res, exp)
2049-
2050-
res = np.nan + pd.DataFrame([1, 2, 3], dtype=dtype)
2051-
exp = pd.DataFrame([np.nan, np.nan, np.nan], dtype=dtype)
2052-
assert_frame_equal(res, exp)
2053-
res = pd.DataFrame([1, 2, 3], dtype=dtype) + np.nan
2054-
assert_frame_equal(res, exp)
2055-
1994+
def test_series_radd_str(self):
1995+
ser = pd.Series(['x', np.nan, 'x'])
1996+
assert_series_equal('a' + ser, pd.Series(['ax', np.nan, 'ax']))
1997+
assert_series_equal(ser + 'a', pd.Series(['xa', np.nan, 'xa']))
1998+
1999+
@pytest.mark.parametrize('dtype', [None, object])
2000+
def test_series_radd_more(self, dtype):
2001+
res = 1 + pd.Series([1, 2, 3], dtype=dtype)
2002+
exp = pd.Series([2, 3, 4], dtype=dtype)
2003+
assert_series_equal(res, exp)
2004+
res = pd.Series([1, 2, 3], dtype=dtype) + 1
2005+
assert_series_equal(res, exp)
2006+
2007+
res = np.nan + pd.Series([1, 2, 3], dtype=dtype)
2008+
exp = pd.Series([np.nan, np.nan, np.nan], dtype=dtype)
2009+
assert_series_equal(res, exp)
2010+
res = pd.Series([1, 2, 3], dtype=dtype) + np.nan
2011+
assert_series_equal(res, exp)
2012+
2013+
s = pd.Series([pd.Timedelta('1 days'), pd.Timedelta('2 days'),
2014+
pd.Timedelta('3 days')], dtype=dtype)
2015+
exp = pd.Series([pd.Timedelta('4 days'), pd.Timedelta('5 days'),
2016+
pd.Timedelta('6 days')])
2017+
assert_series_equal(pd.Timedelta('3 days') + s, exp)
2018+
assert_series_equal(s + pd.Timedelta('3 days'), exp)
2019+
2020+
@pytest.mark.parametrize('data', [
2021+
[1, 2, 3],
2022+
[1.1, 2.2, 3.3],
2023+
[pd.Timestamp('2011-01-01'), pd.Timestamp('2011-01-02'), pd.NaT],
2024+
['x', 'y', 1]])
2025+
@pytest.mark.parametrize('dtype', [None, object])
2026+
def test_series_radd_str_invalid(self, dtype, data):
2027+
ser = Series(data, dtype=dtype)
2028+
with pytest.raises(TypeError):
2029+
'foo_' + ser
2030+
2031+
@pytest.mark.parametrize('data', [
2032+
[1, 2, 3],
2033+
[1.1, 2.2, 3.3],
2034+
[pd.Timestamp('2011-01-01'), pd.Timestamp('2011-01-02'), pd.NaT],
2035+
['x', 'y', 1]])
2036+
@pytest.mark.parametrize('dtype', [None, object])
2037+
def test_frame_radd_str_invalid(self, dtype, data):
2038+
df = DataFrame(data, dtype=dtype)
2039+
with pytest.raises(TypeError):
2040+
'foo_' + df
2041+
2042+
@pytest.mark.parametrize('dtype', [None, object])
2043+
def test_frame_radd_more(self, dtype):
2044+
res = 1 + pd.DataFrame([1, 2, 3], dtype=dtype)
2045+
exp = pd.DataFrame([2, 3, 4], dtype=dtype)
2046+
assert_frame_equal(res, exp)
2047+
res = pd.DataFrame([1, 2, 3], dtype=dtype) + 1
2048+
assert_frame_equal(res, exp)
2049+
2050+
res = np.nan + pd.DataFrame([1, 2, 3], dtype=dtype)
2051+
exp = pd.DataFrame([np.nan, np.nan, np.nan], dtype=dtype)
2052+
assert_frame_equal(res, exp)
2053+
res = pd.DataFrame([1, 2, 3], dtype=dtype) + np.nan
2054+
assert_frame_equal(res, exp)
2055+
2056+
def test_frame_radd_str(self):
20562057
df = pd.DataFrame(['x', np.nan, 'x'])
20572058
assert_frame_equal('a' + df, pd.DataFrame(['ax', np.nan, 'ax']))
20582059
assert_frame_equal(df + 'a', pd.DataFrame(['xa', np.nan, 'xa']))

0 commit comments

Comments
 (0)