-
-
Notifications
You must be signed in to change notification settings - Fork 18.6k
BUG: Timestamp == date match stdlib #36131
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 50 commits
4c5eddd
c632c9f
9e64be3
42649fb
47121dd
1decb3e
57c5dd3
a358463
ffa7ad7
e5e98d4
408db5a
9b1b3f3
a6d4228
5517a68
5ce9683
f43e920
1bffa44
8c6012e
ec827a0
fbb1576
efae3ad
e53dc16
e504852
5b34905
f0060e3
f97848e
41ae9cd
f0add43
da0888c
27c8005
8036c99
a8fed20
198d9e0
67429a1
3513f3b
6df2513
dbb3086
87ff44a
c97a1e7
67b3fb2
da9426c
13f170b
ba18c96
de69fb4
d412ac0
cf85a4f
a1e32d7
938ad02
06589ca
4cd919c
947daac
5196b1e
4d7aa41
a307a0c
a92409d
164e2b4
a321fdd
0cb6019
3557c7a
af49cb5
7a423f4
677760f
b8c67e9
fbfdaff
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -67,76 +67,164 @@ def test_drop_duplicates_no_duplicates(any_numpy_dtype, keep, values): | |
|
||
|
||
class TestSeriesDropDuplicates: | ||
@pytest.mark.parametrize( | ||
"dtype", | ||
["int_", "uint", "float_", "unicode_", "timedelta64[h]", "datetime64[D]"], | ||
@pytest.fixture( | ||
params=["int_", "uint", "float_", "unicode_", "timedelta64[h]", "datetime64[D]"] | ||
) | ||
def test_drop_duplicates_categorical_non_bool(self, dtype, ordered): | ||
cat_array = np.array([1, 2, 3, 4, 5], dtype=np.dtype(dtype)) | ||
def dtype(self, request): | ||
return request.param | ||
|
||
@pytest.fixture | ||
def cat_series1(self, dtype, ordered): | ||
# Test case 1 | ||
cat_array = np.array([1, 2, 3, 4, 5], dtype=np.dtype(dtype)) | ||
|
||
input1 = np.array([1, 2, 3, 3], dtype=np.dtype(dtype)) | ||
|
||
tc1 = Series(Categorical(input1, categories=cat_array, ordered=ordered)) | ||
if dtype == "datetime64[D]": | ||
# pre-empty flaky xfail, tc1 values are seemingly-random | ||
if not (np.array(tc1) == input1).all(): | ||
pytest.xfail(reason="GH#7996") | ||
return tc1 | ||
|
||
def _maybe_xfail_tc(self, tc, request): | ||
warn = None | ||
if tc.cat.categories.dtype.kind == "M": | ||
if len(tc) == 4: | ||
# This is cat_series1 | ||
input_arr = np.array([1, 2, 3, 3], dtype=np.dtype("datetime64[D]")) | ||
else: | ||
# This is tc2 | ||
input_arr = np.array( | ||
[1, 2, 3, 5, 3, 2, 4], dtype=np.dtype("datetime64[D]") | ||
) | ||
|
||
if not (np.array(tc) == input_arr).all(): | ||
mark = pytest.mark.xfail( | ||
reason="GH#7996 tc1/tc2 values are seemingly-random", | ||
raises=AssertionError, | ||
) | ||
request.node.add_marker(mark) | ||
|
||
# Also warn about Timestamp vs date deprecation | ||
warn = FutureWarning | ||
return warn | ||
|
||
def test_drop_duplicates_categorical_non_bool(self, cat_series1, request): | ||
tc1 = cat_series1 | ||
warn = self._maybe_xfail_tc(tc1, request) | ||
|
||
expected = Series([False, False, False, True]) | ||
tm.assert_series_equal(tc1.duplicated(), expected) | ||
tm.assert_series_equal(tc1.drop_duplicates(), tc1[~expected]) | ||
sc = tc1.copy() | ||
return_value = sc.drop_duplicates(inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc1[~expected]) | ||
|
||
with tm.assert_produces_warning(warn): | ||
result = tc1.duplicated() | ||
tm.assert_series_equal(result, expected) | ||
|
||
result = tc1.drop_duplicates() | ||
tm.assert_series_equal(result, tc1[~expected]) | ||
|
||
sc = tc1.copy() | ||
return_value = sc.drop_duplicates(inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc1[~expected]) | ||
|
||
def test_drop_duplicates_categorical_non_bool_keeplast(self, cat_series1, request): | ||
tc1 = cat_series1 | ||
warn = self._maybe_xfail_tc(tc1, request) | ||
|
||
expected = Series([False, False, True, False]) | ||
tm.assert_series_equal(tc1.duplicated(keep="last"), expected) | ||
tm.assert_series_equal(tc1.drop_duplicates(keep="last"), tc1[~expected]) | ||
sc = tc1.copy() | ||
return_value = sc.drop_duplicates(keep="last", inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc1[~expected]) | ||
|
||
with tm.assert_produces_warning(warn): | ||
result = tc1.duplicated(keep="last") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i find these warnings user facing is odd There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looks like these can almost be removed, but for a weird interaction with the flaky xfail in this test, which I think i can track down to the Categorical constructor, will take a swing at separately. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed by #38791 |
||
tm.assert_series_equal(result, expected) | ||
|
||
result = tc1.drop_duplicates(keep="last") | ||
tm.assert_series_equal(result, tc1[~expected]) | ||
|
||
sc = tc1.copy() | ||
return_value = sc.drop_duplicates(keep="last", inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc1[~expected]) | ||
|
||
def test_drop_duplicates_categorical_non_bool_keepfalse(self, cat_series1, request): | ||
tc1 = cat_series1 | ||
warn = self._maybe_xfail_tc(tc1, request) | ||
|
||
expected = Series([False, False, True, True]) | ||
tm.assert_series_equal(tc1.duplicated(keep=False), expected) | ||
tm.assert_series_equal(tc1.drop_duplicates(keep=False), tc1[~expected]) | ||
sc = tc1.copy() | ||
return_value = sc.drop_duplicates(keep=False, inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc1[~expected]) | ||
|
||
# Test case 2 | ||
with tm.assert_produces_warning(warn): | ||
result = tc1.duplicated(keep=False) | ||
tm.assert_series_equal(result, expected) | ||
|
||
result = tc1.drop_duplicates(keep=False) | ||
tm.assert_series_equal(result, tc1[~expected]) | ||
|
||
sc = tc1.copy() | ||
return_value = sc.drop_duplicates(keep=False, inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc1[~expected]) | ||
|
||
@pytest.fixture | ||
def cat_series2(self, dtype, ordered): | ||
# Test case 2; TODO: better name | ||
cat_array = np.array([1, 2, 3, 4, 5], dtype=np.dtype(dtype)) | ||
|
||
input2 = np.array([1, 2, 3, 5, 3, 2, 4], dtype=np.dtype(dtype)) | ||
tc2 = Series(Categorical(input2, categories=cat_array, ordered=ordered)) | ||
if dtype == "datetime64[D]": | ||
# pre-empty flaky xfail, tc2 values are seemingly-random | ||
if not (np.array(tc2) == input2).all(): | ||
pytest.xfail(reason="GH#7996") | ||
return tc2 | ||
|
||
def test_drop_duplicates_categorical_non_bool2(self, cat_series2, request): | ||
# Test case 2; TODO: better name | ||
tc2 = cat_series2 | ||
warn = self._maybe_xfail_tc(tc2, request) | ||
|
||
expected = Series([False, False, False, False, True, True, False]) | ||
tm.assert_series_equal(tc2.duplicated(), expected) | ||
tm.assert_series_equal(tc2.drop_duplicates(), tc2[~expected]) | ||
sc = tc2.copy() | ||
return_value = sc.drop_duplicates(inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc2[~expected]) | ||
|
||
with tm.assert_produces_warning(warn): | ||
result = tc2.duplicated() | ||
tm.assert_series_equal(result, expected) | ||
|
||
result = tc2.drop_duplicates() | ||
tm.assert_series_equal(result, tc2[~expected]) | ||
|
||
sc = tc2.copy() | ||
return_value = sc.drop_duplicates(inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc2[~expected]) | ||
|
||
def test_drop_duplicates_categorical_non_bool2_keeplast(self, cat_series2, request): | ||
tc2 = cat_series2 | ||
warn = self._maybe_xfail_tc(tc2, request) | ||
|
||
expected = Series([False, True, True, False, False, False, False]) | ||
tm.assert_series_equal(tc2.duplicated(keep="last"), expected) | ||
tm.assert_series_equal(tc2.drop_duplicates(keep="last"), tc2[~expected]) | ||
sc = tc2.copy() | ||
return_value = sc.drop_duplicates(keep="last", inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc2[~expected]) | ||
|
||
with tm.assert_produces_warning(warn): | ||
result = tc2.duplicated(keep="last") | ||
tm.assert_series_equal(result, expected) | ||
|
||
result = tc2.drop_duplicates(keep="last") | ||
tm.assert_series_equal(result, tc2[~expected]) | ||
|
||
sc = tc2.copy() | ||
return_value = sc.drop_duplicates(keep="last", inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc2[~expected]) | ||
|
||
def test_drop_duplicates_categorical_non_bool2_keepfalse( | ||
self, cat_series2, request | ||
): | ||
tc2 = cat_series2 | ||
warn = self._maybe_xfail_tc(tc2, request) | ||
|
||
expected = Series([False, True, True, False, True, True, False]) | ||
tm.assert_series_equal(tc2.duplicated(keep=False), expected) | ||
tm.assert_series_equal(tc2.drop_duplicates(keep=False), tc2[~expected]) | ||
sc = tc2.copy() | ||
return_value = sc.drop_duplicates(keep=False, inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc2[~expected]) | ||
|
||
with tm.assert_produces_warning(warn): | ||
result = tc2.duplicated(keep=False) | ||
tm.assert_series_equal(result, expected) | ||
|
||
result = tc2.drop_duplicates(keep=False) | ||
tm.assert_series_equal(result, tc2[~expected]) | ||
|
||
sc = tc2.copy() | ||
return_value = sc.drop_duplicates(keep=False, inplace=True) | ||
assert return_value is None | ||
tm.assert_series_equal(sc, tc2[~expected]) | ||
|
||
def test_drop_duplicates_categorical_bool(self, ordered): | ||
tc = Series( | ||
|
Uh oh!
There was an error while loading. Please reload this page.