From 187ad13093cd90307d01b2b9081873446aa9cb7a Mon Sep 17 00:00:00 2001 From: anirudnits Date: Fri, 4 Oct 2019 21:12:18 +0530 Subject: [PATCH 1/6] Added test test_datetimeField_after_setitem for issue #6942 in test_frame.py --- pandas/tests/generic/test_frame.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pandas/tests/generic/test_frame.py b/pandas/tests/generic/test_frame.py index ff9895cf14318..d3dc3557b4e15 100644 --- a/pandas/tests/generic/test_frame.py +++ b/pandas/tests/generic/test_frame.py @@ -4,6 +4,7 @@ import numpy as np import pytest +from datetime import datetime import pandas.util._test_decorators as td @@ -287,3 +288,32 @@ def test_deepcopy_empty(self): empty_frame_copy = deepcopy(empty_frame) self._compare(empty_frame_copy, empty_frame) + + def test_datetimeField_after_setitem(self): + # This test covers the unexpected behaviour of datetimeField when using + # setitem on another column as reported in issue #6942 + + start = pd.to_datetime("20140401") + + df = pd.DataFrame( + index=pd.date_range(start, periods=1), columns=["timenow", "Live"] + ) + + df.at[start, "timenow"] = datetime.today() # initial time. + time1 = df.at[start, "timenow"] + + df.at[ + start, "timenow" + ] = datetime.today() # modified time before 'Live' column is set. + time2 = df.at[start, "timenow"] + + df.Live = True # setting the 'Live' column to True. + + df.at[ + start, "timenow" + ] = datetime.today() # modified time after 'Live' column is set. + time3 = df.at[start, "timenow"] + + assert not time1 == time2 + assert not time2 == time3 + assert not time3 == time1 From 80c52d60baf534a62de5cad659ee01921b2660e7 Mon Sep 17 00:00:00 2001 From: anirudnits Date: Fri, 4 Oct 2019 22:04:48 +0530 Subject: [PATCH 2/6] Added sleep time of 1 second in between assignments --- pandas/tests/generic/test_frame.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandas/tests/generic/test_frame.py b/pandas/tests/generic/test_frame.py index d3dc3557b4e15..aa867e87ef48f 100644 --- a/pandas/tests/generic/test_frame.py +++ b/pandas/tests/generic/test_frame.py @@ -5,6 +5,7 @@ import numpy as np import pytest from datetime import datetime +import time import pandas.util._test_decorators as td @@ -302,6 +303,8 @@ def test_datetimeField_after_setitem(self): df.at[start, "timenow"] = datetime.today() # initial time. time1 = df.at[start, "timenow"] + time.sleep(1) # sleep time of 1 second in between assignments. + df.at[ start, "timenow" ] = datetime.today() # modified time before 'Live' column is set. @@ -309,6 +312,8 @@ def test_datetimeField_after_setitem(self): df.Live = True # setting the 'Live' column to True. + time.sleep(1) # sleep time of 1 second in between assignments. + df.at[ start, "timenow" ] = datetime.today() # modified time after 'Live' column is set. From 4e02832d82d14921c56ef8400250e96c870e16ac Mon Sep 17 00:00:00 2001 From: anirudnits Date: Tue, 8 Oct 2019 23:48:44 +0530 Subject: [PATCH 3/6] Added test test_datetimeField_after_setitem_with_at in tests/generic/test_frame.py --- pandas/tests/generic/test_frame.py | 35 ++++++++++++------------------ 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/pandas/tests/generic/test_frame.py b/pandas/tests/generic/test_frame.py index aa867e87ef48f..2325fa3e6d7f2 100644 --- a/pandas/tests/generic/test_frame.py +++ b/pandas/tests/generic/test_frame.py @@ -1,11 +1,10 @@ from copy import deepcopy +from datetime import datetime from distutils.version import LooseVersion from operator import methodcaller import numpy as np import pytest -from datetime import datetime -import time import pandas.util._test_decorators as td @@ -290,35 +289,29 @@ def test_deepcopy_empty(self): self._compare(empty_frame_copy, empty_frame) - def test_datetimeField_after_setitem(self): + def test_datetimeField_after_setitem_with_at(self): # This test covers the unexpected behaviour of datetimeField when using # setitem on another column as reported in issue #6942 start = pd.to_datetime("20140401") - df = pd.DataFrame( + result = pd.DataFrame( index=pd.date_range(start, periods=1), columns=["timenow", "Live"] ) - df.at[start, "timenow"] = datetime.today() # initial time. - time1 = df.at[start, "timenow"] + result.at[start, "timenow"] = datetime.today() # initial datetime. - time.sleep(1) # sleep time of 1 second in between assignments. + new_datetime = datetime.today() - df.at[ - start, "timenow" - ] = datetime.today() # modified time before 'Live' column is set. - time2 = df.at[start, "timenow"] + result.Live = True - df.Live = True # setting the 'Live' column to True. + # Changing the value in "timenow" column after setting the "Live" column to True + result.at[start, "timenow"] = new_datetime - time.sleep(1) # sleep time of 1 second in between assignments. - - df.at[ - start, "timenow" - ] = datetime.today() # modified time after 'Live' column is set. - time3 = df.at[start, "timenow"] + expected = pd.DataFrame( + [[new_datetime, "True"]], + index=pd.date_range(start, periods=1), + columns=["timenow", "Live"], + ) - assert not time1 == time2 - assert not time2 == time3 - assert not time3 == time1 + assert_frame_equal(result, expected) From 93f03853e1712b03dd11754cdd9a1dbc140e86b3 Mon Sep 17 00:00:00 2001 From: anirudnits Date: Wed, 9 Oct 2019 00:45:59 +0530 Subject: [PATCH 4/6] Added test test_datetimeField_after_setitem_with_at in tests/generic/test_frame.py --- pandas/tests/generic/test_frame.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/tests/generic/test_frame.py b/pandas/tests/generic/test_frame.py index 2325fa3e6d7f2..90fc929366b2c 100644 --- a/pandas/tests/generic/test_frame.py +++ b/pandas/tests/generic/test_frame.py @@ -305,13 +305,13 @@ def test_datetimeField_after_setitem_with_at(self): result.Live = True - # Changing the value in "timenow" column after setting the "Live" column to True + # Changing the value in "timenow" column after setting the "Live" column to True. result.at[start, "timenow"] = new_datetime expected = pd.DataFrame( - [[new_datetime, "True"]], + [[new_datetime, True]], index=pd.date_range(start, periods=1), columns=["timenow", "Live"], ) - assert_frame_equal(result, expected) + assert_frame_equal(result, expected, check_dtype=False) From 259013a8896a82eec51aa1628d565c019ecc7067 Mon Sep 17 00:00:00 2001 From: anirudnits Date: Thu, 10 Oct 2019 19:27:34 +0530 Subject: [PATCH 5/6] Made the required changes --- pandas/tests/generic/test_frame.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/generic/test_frame.py b/pandas/tests/generic/test_frame.py index 90fc929366b2c..1bdb0225b71cd 100644 --- a/pandas/tests/generic/test_frame.py +++ b/pandas/tests/generic/test_frame.py @@ -289,7 +289,7 @@ def test_deepcopy_empty(self): self._compare(empty_frame_copy, empty_frame) - def test_datetimeField_after_setitem_with_at(self): + def test_datetime_after_setitem_with_at(self): # This test covers the unexpected behaviour of datetimeField when using # setitem on another column as reported in issue #6942 @@ -299,13 +299,13 @@ def test_datetimeField_after_setitem_with_at(self): index=pd.date_range(start, periods=1), columns=["timenow", "Live"] ) - result.at[start, "timenow"] = datetime.today() # initial datetime. + result.at[start, "timenow"] = datetime.today() new_datetime = datetime.today() result.Live = True - # Changing the value in "timenow" column after setting the "Live" column to True. + # Changing the value in "timenow" column after "Live" colunn is set to True. result.at[start, "timenow"] = new_datetime expected = pd.DataFrame( @@ -314,4 +314,4 @@ def test_datetimeField_after_setitem_with_at(self): columns=["timenow", "Live"], ) - assert_frame_equal(result, expected, check_dtype=False) + assert_frame_equal(result, expected) From 9cbf34cf2106fe1a9102a1c01b16c2f9730f7520 Mon Sep 17 00:00:00 2001 From: anirudnits Date: Sat, 4 Jan 2020 09:48:46 +0530 Subject: [PATCH 6/6] Fixed a typo which was causing a ValueError --- pandas/tests/generic/test_frame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/generic/test_frame.py b/pandas/tests/generic/test_frame.py index 31296225ba7b9..d2418d56e66eb 100644 --- a/pandas/tests/generic/test_frame.py +++ b/pandas/tests/generic/test_frame.py @@ -307,4 +307,4 @@ def test_datetime_after_setitem_with_at(self): columns=["timenow", "Live"], ) - assert_frame_equal(result, expected) + tm.assert_frame_equal(result, expected)