|
5 | 5 | import operator
|
6 | 6 | from datetime import datetime, timedelta
|
7 | 7 | import warnings
|
| 8 | +from itertools import product, starmap |
8 | 9 |
|
9 | 10 | import numpy as np
|
10 | 11 | import pytest
|
@@ -64,6 +65,32 @@ def test_tz_aware_scalar_comparison(self, timestamps):
|
64 | 65 |
|
65 | 66 |
|
66 | 67 | class TestDatetime64SeriesComparison(object):
|
| 68 | + # TODO: moved from tests.series.test_operators; needs cleanup |
| 69 | + def test_comparison_invalid(self): |
| 70 | + # GH#4968 |
| 71 | + # invalid date/int comparisons |
| 72 | + ser = Series(range(5)) |
| 73 | + ser2 = Series(pd.date_range('20010101', periods=5)) |
| 74 | + |
| 75 | + for (x, y) in [(ser, ser2), (ser2, ser)]: |
| 76 | + |
| 77 | + result = x == y |
| 78 | + expected = Series([False] * 5) |
| 79 | + tm.assert_series_equal(result, expected) |
| 80 | + |
| 81 | + result = x != y |
| 82 | + expected = Series([True] * 5) |
| 83 | + tm.assert_series_equal(result, expected) |
| 84 | + |
| 85 | + with pytest.raises(TypeError): |
| 86 | + x >= y |
| 87 | + with pytest.raises(TypeError): |
| 88 | + x > y |
| 89 | + with pytest.raises(TypeError): |
| 90 | + x < y |
| 91 | + with pytest.raises(TypeError): |
| 92 | + x <= y |
| 93 | + |
67 | 94 | @pytest.mark.parametrize('data', [
|
68 | 95 | [Timestamp('2011-01-01'), NaT, Timestamp('2011-01-03')],
|
69 | 96 | [Timedelta('1 days'), NaT, Timedelta('3 days')],
|
@@ -1360,7 +1387,95 @@ def test_dti_sub_pi(self, dti_freq, pi_freq, op, box):
|
1360 | 1387 | with pytest.raises(TypeError):
|
1361 | 1388 | op(dti, pi)
|
1362 | 1389 |
|
1363 |
| - # ------------------------------------------------------------- |
| 1390 | + # ------------------------------------------------------------------- |
| 1391 | + # TODO: Most of this block is moved from series or frame tests, needs |
| 1392 | + # cleanup, box-parametrization, and de-duplication |
| 1393 | + |
| 1394 | + @pytest.mark.parametrize('op', [operator.add, operator.sub]) |
| 1395 | + def test_timedelta64_equal_timedelta_supported_ops(self, op): |
| 1396 | + ser = Series([Timestamp('20130301'), |
| 1397 | + Timestamp('20130228 23:00:00'), |
| 1398 | + Timestamp('20130228 22:00:00'), |
| 1399 | + Timestamp('20130228 21:00:00')]) |
| 1400 | + |
| 1401 | + intervals = ['D', 'h', 'm', 's', 'us'] |
| 1402 | + |
| 1403 | + # TODO: unused |
| 1404 | + # npy16_mappings = {'D': 24 * 60 * 60 * 1000000, |
| 1405 | + # 'h': 60 * 60 * 1000000, |
| 1406 | + # 'm': 60 * 1000000, |
| 1407 | + # 's': 1000000, |
| 1408 | + # 'us': 1} |
| 1409 | + |
| 1410 | + def timedelta64(*args): |
| 1411 | + return sum(starmap(np.timedelta64, zip(args, intervals))) |
| 1412 | + |
| 1413 | + for d, h, m, s, us in product(*([range(2)] * 5)): |
| 1414 | + nptd = timedelta64(d, h, m, s, us) |
| 1415 | + pytd = timedelta(days=d, hours=h, minutes=m, seconds=s, |
| 1416 | + microseconds=us) |
| 1417 | + lhs = op(ser, nptd) |
| 1418 | + rhs = op(ser, pytd) |
| 1419 | + |
| 1420 | + tm.assert_series_equal(lhs, rhs) |
| 1421 | + |
| 1422 | + def test_ops_nat_mixed_datetime64_timedelta64(self): |
| 1423 | + # GH#11349 |
| 1424 | + timedelta_series = Series([NaT, Timedelta('1s')]) |
| 1425 | + datetime_series = Series([NaT, Timestamp('19900315')]) |
| 1426 | + nat_series_dtype_timedelta = Series([NaT, NaT], |
| 1427 | + dtype='timedelta64[ns]') |
| 1428 | + nat_series_dtype_timestamp = Series([NaT, NaT], dtype='datetime64[ns]') |
| 1429 | + single_nat_dtype_datetime = Series([NaT], dtype='datetime64[ns]') |
| 1430 | + single_nat_dtype_timedelta = Series([NaT], dtype='timedelta64[ns]') |
| 1431 | + |
| 1432 | + # subtraction |
| 1433 | + tm.assert_series_equal(datetime_series - single_nat_dtype_datetime, |
| 1434 | + nat_series_dtype_timedelta) |
| 1435 | + |
| 1436 | + tm.assert_series_equal(datetime_series - single_nat_dtype_timedelta, |
| 1437 | + nat_series_dtype_timestamp) |
| 1438 | + tm.assert_series_equal(-single_nat_dtype_timedelta + datetime_series, |
| 1439 | + nat_series_dtype_timestamp) |
| 1440 | + |
| 1441 | + # without a Series wrapping the NaT, it is ambiguous |
| 1442 | + # whether it is a datetime64 or timedelta64 |
| 1443 | + # defaults to interpreting it as timedelta64 |
| 1444 | + tm.assert_series_equal(nat_series_dtype_timestamp - |
| 1445 | + single_nat_dtype_datetime, |
| 1446 | + nat_series_dtype_timedelta) |
| 1447 | + |
| 1448 | + tm.assert_series_equal(nat_series_dtype_timestamp - |
| 1449 | + single_nat_dtype_timedelta, |
| 1450 | + nat_series_dtype_timestamp) |
| 1451 | + tm.assert_series_equal(-single_nat_dtype_timedelta + |
| 1452 | + nat_series_dtype_timestamp, |
| 1453 | + nat_series_dtype_timestamp) |
| 1454 | + |
| 1455 | + with pytest.raises(TypeError): |
| 1456 | + timedelta_series - single_nat_dtype_datetime |
| 1457 | + |
| 1458 | + # addition |
| 1459 | + tm.assert_series_equal(nat_series_dtype_timestamp + |
| 1460 | + single_nat_dtype_timedelta, |
| 1461 | + nat_series_dtype_timestamp) |
| 1462 | + tm.assert_series_equal(single_nat_dtype_timedelta + |
| 1463 | + nat_series_dtype_timestamp, |
| 1464 | + nat_series_dtype_timestamp) |
| 1465 | + |
| 1466 | + tm.assert_series_equal(nat_series_dtype_timestamp + |
| 1467 | + single_nat_dtype_timedelta, |
| 1468 | + nat_series_dtype_timestamp) |
| 1469 | + tm.assert_series_equal(single_nat_dtype_timedelta + |
| 1470 | + nat_series_dtype_timestamp, |
| 1471 | + nat_series_dtype_timestamp) |
| 1472 | + |
| 1473 | + tm.assert_series_equal(nat_series_dtype_timedelta + |
| 1474 | + single_nat_dtype_datetime, |
| 1475 | + nat_series_dtype_timestamp) |
| 1476 | + tm.assert_series_equal(single_nat_dtype_datetime + |
| 1477 | + nat_series_dtype_timedelta, |
| 1478 | + nat_series_dtype_timestamp) |
1364 | 1479 |
|
1365 | 1480 | def test_ufunc_coercions(self):
|
1366 | 1481 | idx = date_range('2011-01-01', periods=3, freq='2D', name='x')
|
|
0 commit comments