From 2a38350cd0e8fb9e13627b3344ec7e88943aefe6 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 24 Aug 2021 11:43:00 +0530 Subject: [PATCH 01/69] boundary inputs updated for DataFrame.between_time function --- pandas/core/generic.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 36c0d024369e6..7afe4f87c8bc5 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7576,8 +7576,9 @@ def between_time( self: FrameOrSeries, start_time, end_time, - include_start: bool_t = True, - include_end: bool_t = True, + include_start= 'bool_t', + include_end= 'bool_t', # iskey liye user ko warning kaise de ab? while mentaing original behvr + inclusive="both", # {"both", "neither", "left", "right"} axis=None, ) -> FrameOrSeries: """ @@ -7649,6 +7650,36 @@ def between_time( if not isinstance(index, DatetimeIndex): raise TypeError("Index must be DatetimeIndex") + if include_start == 'bool_t' and include_start == 'bool_t': # old type of args not passed + if inclusive == "both": + include_start=True + include_end=True + elif inclusive == "neither": + include_start=False + include_end=False + elif inclusive == "left": + include_start=True + include_end=False + elif inclusive == "right": + include_start=False + include_end=True + else: + raise ValueError( + "Inclusive has to be either string of 'both'," + "'left', 'right', or 'neither'." + ) + else: # old args passed + warnings.warn( + "`include_start` and `include_end` are deprecated in" + "favour of `inclusive`.", + FutureWarning, + stacklevel=2, + ) + if include_start == 'bool_t': + include_start = True + if include_end == 'bool_t': + include_end = True + indexer = index.indexer_between_time( start_time, end_time, include_start=include_start, include_end=include_end ) From 4272175914921c81add92be67d5dfe4d1a2185a3 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Thu, 26 Aug 2021 04:55:00 +0000 Subject: [PATCH 02/69] addev virtual environment to gitignore --- .gitignore | 3 +++ pandas/tests/frame/methods/test_between_time.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2c337be60e94e..4c683e1dc452d 100644 --- a/.gitignore +++ b/.gitignore @@ -120,3 +120,6 @@ doc/build/html/index.html doc/tmp.sv env/ doc/source/savefig/ + +# Env created by suyash +myenv/ diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 0daa267767269..972c111ad66b8 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -77,7 +77,7 @@ def test_between_time(self, close_open_fixture, frame_or_series): stime = time(0, 0) etime = time(1, 0) - inc_start, inc_end = close_open_fixture + inc_start, inc_end = close_open_fixture ## what is close_open_fixture filtered = ts.between_time(stime, etime, inc_start, inc_end) exp_len = 13 * 4 + 1 From ce929d23ffac407df0efded9cfceba180dc7aae9 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Thu, 26 Aug 2021 05:04:17 +0000 Subject: [PATCH 03/69] added env to gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 2c337be60e94e..441f63e19adc9 100644 --- a/.gitignore +++ b/.gitignore @@ -120,3 +120,7 @@ doc/build/html/index.html doc/tmp.sv env/ doc/source/savefig/ + + +# venv by me +/myenv \ No newline at end of file From e0924f6bb1b262d820e9be3f4c9b7219f40019a0 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:10:23 +0000 Subject: [PATCH 04/69] tests work now --- pandas/core/generic.py | 46 ++-- pandas/tests/frame/conftest.py | 2 +- .../frame/methods/test_between_time copy.py | 209 ++++++++++++++++++ .../tests/frame/methods/test_between_time.py | 38 +++- 4 files changed, 261 insertions(+), 34 deletions(-) create mode 100644 pandas/tests/frame/methods/test_between_time copy.py diff --git a/pandas/core/generic.py b/pandas/core/generic.py index a38de94aa7ee6..999bfcb283d5b 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7575,9 +7575,9 @@ def between_time( self: FrameOrSeries, start_time, end_time, + inclusive="both", include_start= 'bool_t', - include_end= 'bool_t', # iskey liye user ko warning kaise de ab? while mentaing original behvr - inclusive="both", # {"both", "neither", "left", "right"} + include_end= 'bool_t', axis=None, ) -> FrameOrSeries: """ @@ -7649,25 +7649,9 @@ def between_time( if not isinstance(index, DatetimeIndex): raise TypeError("Index must be DatetimeIndex") - if include_start == 'bool_t' and include_start == 'bool_t': # old type of args not passed - if inclusive == "both": - include_start=True - include_end=True - elif inclusive == "neither": - include_start=False - include_end=False - elif inclusive == "left": - include_start=True - include_end=False - elif inclusive == "right": - include_start=False - include_end=True - else: - raise ValueError( - "Inclusive has to be either string of 'both'," - "'left', 'right', or 'neither'." - ) - else: # old args passed + # if old arguments ('include_start', 'include_end') have been passed + if (include_start != 'bool_t') or (include_start != 'bool_t'): + # print("\nasd ->\n", "inclusive=", inclusive, "\ninclude_start, _end = ", include_start, include_end) warnings.warn( "`include_start` and `include_end` are deprecated in" "favour of `inclusive`.", @@ -7678,7 +7662,25 @@ def between_time( include_start = True if include_end == 'bool_t': include_end = True - + else: # if old args haven't been passed + if inclusive == "both": + include_start = True + include_end = True + elif inclusive == "neither": + include_start = False + include_end = False + elif inclusive == "left": + include_start = True + include_end = False + elif inclusive == "right": + include_start = False + include_end = True + else: + raise ValueError( + "Inclusive has to be either string of 'both'," + "'left', 'right', or 'neither'." + ) + indexer = index.indexer_between_time( start_time, end_time, include_start=include_start, include_end=include_end ) diff --git a/pandas/tests/frame/conftest.py b/pandas/tests/frame/conftest.py index 7d485ee62c7d2..17614d140ebef 100644 --- a/pandas/tests/frame/conftest.py +++ b/pandas/tests/frame/conftest.py @@ -11,7 +11,7 @@ import pandas._testing as tm -@pytest.fixture(params=product([True, False], [True, False])) +@pytest.fixture(params=["both", "neither", "left", "right"]) def close_open_fixture(request): return request.param diff --git a/pandas/tests/frame/methods/test_between_time copy.py b/pandas/tests/frame/methods/test_between_time copy.py new file mode 100644 index 0000000000000..972c111ad66b8 --- /dev/null +++ b/pandas/tests/frame/methods/test_between_time copy.py @@ -0,0 +1,209 @@ +from datetime import ( + datetime, + time, +) + +import numpy as np +import pytest + +from pandas._libs.tslibs import timezones +import pandas.util._test_decorators as td + +from pandas import ( + DataFrame, + Series, + date_range, +) +import pandas._testing as tm + + +class TestBetweenTime: + @td.skip_if_has_locale + def test_between_time_formats(self, frame_or_series): + # GH#11818 + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + if frame_or_series is Series: + ts = ts[0] + + strings = [ + ("2:00", "2:30"), + ("0200", "0230"), + ("2:00am", "2:30am"), + ("0200am", "0230am"), + ("2:00:00", "2:30:00"), + ("020000", "023000"), + ("2:00:00am", "2:30:00am"), + ("020000am", "023000am"), + ] + expected_length = 28 + + for time_string in strings: + assert len(ts.between_time(*time_string)) == expected_length + + @pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"]) + def test_localized_between_time(self, tzstr, frame_or_series): + tz = timezones.maybe_get_tz(tzstr) + + rng = date_range("4/16/2012", "5/1/2012", freq="H") + ts = Series(np.random.randn(len(rng)), index=rng) + if frame_or_series is DataFrame: + ts = ts.to_frame() + + ts_local = ts.tz_localize(tzstr) + + t1, t2 = time(10, 0), time(11, 0) + result = ts_local.between_time(t1, t2) + expected = ts.between_time(t1, t2).tz_localize(tzstr) + tm.assert_equal(result, expected) + assert timezones.tz_compare(result.index.tz, tz) + + def test_between_time_types(self, frame_or_series): + # GH11818 + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + obj = DataFrame({"A": 0}, index=rng) + if frame_or_series is Series: + obj = obj["A"] + + msg = r"Cannot convert arg \[datetime\.datetime\(2010, 1, 2, 1, 0\)\] to a time" + with pytest.raises(ValueError, match=msg): + obj.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5)) + + def test_between_time(self, close_open_fixture, frame_or_series): + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + if frame_or_series is not DataFrame: + ts = ts[0] + + stime = time(0, 0) + etime = time(1, 0) + inc_start, inc_end = close_open_fixture ## what is close_open_fixture + + filtered = ts.between_time(stime, etime, inc_start, inc_end) + exp_len = 13 * 4 + 1 + if not inc_start: + exp_len -= 5 + if not inc_end: + exp_len -= 4 + + assert len(filtered) == exp_len + for rs in filtered.index: + t = rs.time() + if inc_start: + assert t >= stime + else: + assert t > stime + + if inc_end: + assert t <= etime + else: + assert t < etime + + result = ts.between_time("00:00", "01:00") + expected = ts.between_time(stime, etime) + tm.assert_equal(result, expected) + + # across midnight + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + if frame_or_series is not DataFrame: + ts = ts[0] + stime = time(22, 0) + etime = time(9, 0) + + filtered = ts.between_time(stime, etime, inc_start, inc_end) + exp_len = (12 * 11 + 1) * 4 + 1 + if not inc_start: + exp_len -= 4 + if not inc_end: + exp_len -= 4 + + assert len(filtered) == exp_len + for rs in filtered.index: + t = rs.time() + if inc_start: + assert (t >= stime) or (t <= etime) + else: + assert (t > stime) or (t <= etime) + + if inc_end: + assert (t <= etime) or (t >= stime) + else: + assert (t < etime) or (t >= stime) + + def test_between_time_raises(self, frame_or_series): + # GH#20725 + obj = DataFrame([[1, 2, 3], [4, 5, 6]]) + if frame_or_series is not DataFrame: + obj = obj[0] + + msg = "Index must be DatetimeIndex" + with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex + obj.between_time(start_time="00:00", end_time="12:00") + + def test_between_time_axis(self, frame_or_series): + # GH#8839 + rng = date_range("1/1/2000", periods=100, freq="10min") + ts = Series(np.random.randn(len(rng)), index=rng) + if frame_or_series is DataFrame: + ts = ts.to_frame() + + stime, etime = ("08:00:00", "09:00:00") + expected_length = 7 + + assert len(ts.between_time(stime, etime)) == expected_length + assert len(ts.between_time(stime, etime, axis=0)) == expected_length + msg = f"No axis named {ts.ndim} for object type {type(ts).__name__}" + with pytest.raises(ValueError, match=msg): + ts.between_time(stime, etime, axis=ts.ndim) + + def test_between_time_axis_aliases(self, axis): + # GH#8839 + rng = date_range("1/1/2000", periods=100, freq="10min") + ts = DataFrame(np.random.randn(len(rng), len(rng))) + stime, etime = ("08:00:00", "09:00:00") + exp_len = 7 + + if axis in ["index", 0]: + ts.index = rng + assert len(ts.between_time(stime, etime)) == exp_len + assert len(ts.between_time(stime, etime, axis=0)) == exp_len + + if axis in ["columns", 1]: + ts.columns = rng + selected = ts.between_time(stime, etime, axis=1).columns + assert len(selected) == exp_len + + def test_between_time_axis_raises(self, axis): + # issue 8839 + rng = date_range("1/1/2000", periods=100, freq="10min") + mask = np.arange(0, len(rng)) + rand_data = np.random.randn(len(rng), len(rng)) + ts = DataFrame(rand_data, index=rng, columns=rng) + stime, etime = ("08:00:00", "09:00:00") + + msg = "Index must be DatetimeIndex" + if axis in ["columns", 1]: + ts.index = mask + with pytest.raises(TypeError, match=msg): + ts.between_time(stime, etime) + with pytest.raises(TypeError, match=msg): + ts.between_time(stime, etime, axis=0) + + if axis in ["index", 0]: + ts.columns = mask + with pytest.raises(TypeError, match=msg): + ts.between_time(stime, etime, axis=1) + + def test_between_time_datetimeindex(self): + index = date_range("2012-01-01", "2012-01-05", freq="30min") + df = DataFrame(np.random.randn(len(index), 5), index=index) + bkey = slice(time(13, 0, 0), time(14, 0, 0)) + binds = [26, 27, 28, 74, 75, 76, 122, 123, 124, 170, 171, 172] + + result = df.between_time(bkey.start, bkey.stop) + expected = df.loc[bkey] + expected2 = df.iloc[binds] + tm.assert_frame_equal(result, expected) + tm.assert_frame_equal(result, expected2) + assert len(result) == 12 diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 972c111ad66b8..4a97c6267e46a 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -69,6 +69,19 @@ def test_between_time_types(self, frame_or_series): with pytest.raises(ValueError, match=msg): obj.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5)) + # def test_between_error_args(self): ## added by me (copy paste from pull rq) + # series = Series(date_range("1/1/2000", periods=10)) + # left, right = series[[2, 7]] + + # value_error_msg = ( + # "Inclusive has to be either string of 'both'," + # "'left', 'right', or 'neither'." + # ) + + # with pytest.raises(ValueError, match=value_error_msg): + # series = Series(date_range("1/1/2000", periods=10)) + # series.between(left, right, inclusive="yes") + def test_between_time(self, close_open_fixture, frame_or_series): rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) @@ -77,24 +90,26 @@ def test_between_time(self, close_open_fixture, frame_or_series): stime = time(0, 0) etime = time(1, 0) - inc_start, inc_end = close_open_fixture ## what is close_open_fixture + inclusive = close_open_fixture - filtered = ts.between_time(stime, etime, inc_start, inc_end) + filtered = ts.between_time(stime, etime, inclusive) + print("\naa1", inclusive) exp_len = 13 * 4 + 1 - if not inc_start: + + if inclusive in ["right", "neither"]: # if not inc_start exp_len -= 5 - if not inc_end: + if inclusive in ["left", "neither"]: # if not inc_end exp_len -= 4 assert len(filtered) == exp_len for rs in filtered.index: t = rs.time() - if inc_start: + if inclusive in ["left", "both"]: # if inc_start: assert t >= stime else: assert t > stime - if inc_end: + if inclusive in ["right", "both"]: # if inc_end: assert t <= etime else: assert t < etime @@ -111,22 +126,23 @@ def test_between_time(self, close_open_fixture, frame_or_series): stime = time(22, 0) etime = time(9, 0) - filtered = ts.between_time(stime, etime, inc_start, inc_end) + filtered = ts.between_time(stime, etime, inclusive) ## + print("bb1", inclusive) exp_len = (12 * 11 + 1) * 4 + 1 - if not inc_start: + if inclusive in ["right", "neither"]: # if not inc_start: exp_len -= 4 - if not inc_end: + if inclusive in ["left", "neither"]: # if not inc_end: exp_len -= 4 assert len(filtered) == exp_len for rs in filtered.index: t = rs.time() - if inc_start: + if inclusive == "left" or inclusive == "both": # if inc_start: assert (t >= stime) or (t <= etime) else: assert (t > stime) or (t <= etime) - if inc_end: + if inclusive == "right" or inclusive == "both": # if inc_end: assert (t <= etime) or (t >= stime) else: assert (t < etime) or (t >= stime) From b12957b9e4e77ea8f2ea2225ebba3968f2b43477 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:13:49 +0000 Subject: [PATCH 05/69] comments updated --- pandas/core/generic.py | 5 ++- .../tests/frame/methods/test_between_time.py | 31 ++++++------------- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 999bfcb283d5b..edabca948d2e2 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7649,9 +7649,8 @@ def between_time( if not isinstance(index, DatetimeIndex): raise TypeError("Index must be DatetimeIndex") - # if old arguments ('include_start', 'include_end') have been passed + # if depreciated arguments ('include_start', 'include_end') have been passed if (include_start != 'bool_t') or (include_start != 'bool_t'): - # print("\nasd ->\n", "inclusive=", inclusive, "\ninclude_start, _end = ", include_start, include_end) warnings.warn( "`include_start` and `include_end` are deprecated in" "favour of `inclusive`.", @@ -7662,7 +7661,7 @@ def between_time( include_start = True if include_end == 'bool_t': include_end = True - else: # if old args haven't been passed + else: # if depreciated args haven't been passed if inclusive == "both": include_start = True include_end = True diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 4a97c6267e46a..f7c6da692c85a 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -69,19 +69,6 @@ def test_between_time_types(self, frame_or_series): with pytest.raises(ValueError, match=msg): obj.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5)) - # def test_between_error_args(self): ## added by me (copy paste from pull rq) - # series = Series(date_range("1/1/2000", periods=10)) - # left, right = series[[2, 7]] - - # value_error_msg = ( - # "Inclusive has to be either string of 'both'," - # "'left', 'right', or 'neither'." - # ) - - # with pytest.raises(ValueError, match=value_error_msg): - # series = Series(date_range("1/1/2000", periods=10)) - # series.between(left, right, inclusive="yes") - def test_between_time(self, close_open_fixture, frame_or_series): rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) @@ -96,20 +83,20 @@ def test_between_time(self, close_open_fixture, frame_or_series): print("\naa1", inclusive) exp_len = 13 * 4 + 1 - if inclusive in ["right", "neither"]: # if not inc_start + if inclusive in ["right", "neither"]: exp_len -= 5 - if inclusive in ["left", "neither"]: # if not inc_end + if inclusive in ["left", "neither"]: exp_len -= 4 assert len(filtered) == exp_len for rs in filtered.index: t = rs.time() - if inclusive in ["left", "both"]: # if inc_start: + if inclusive in ["left", "both"]: assert t >= stime else: assert t > stime - if inclusive in ["right", "both"]: # if inc_end: + if inclusive in ["right", "both"]: assert t <= etime else: assert t < etime @@ -126,23 +113,23 @@ def test_between_time(self, close_open_fixture, frame_or_series): stime = time(22, 0) etime = time(9, 0) - filtered = ts.between_time(stime, etime, inclusive) ## + filtered = ts.between_time(stime, etime, inclusive) print("bb1", inclusive) exp_len = (12 * 11 + 1) * 4 + 1 - if inclusive in ["right", "neither"]: # if not inc_start: + if inclusive in ["right", "neither"]: exp_len -= 4 - if inclusive in ["left", "neither"]: # if not inc_end: + if inclusive in ["left", "neither"]: exp_len -= 4 assert len(filtered) == exp_len for rs in filtered.index: t = rs.time() - if inclusive == "left" or inclusive == "both": # if inc_start: + if inclusive == "left" or inclusive == "both": assert (t >= stime) or (t <= etime) else: assert (t > stime) or (t <= etime) - if inclusive == "right" or inclusive == "both": # if inc_end: + if inclusive == "right" or inclusive == "both": assert (t <= etime) or (t >= stime) else: assert (t < etime) or (t >= stime) From f1a06413e327773444a18485a643d0d92f51fa14 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:16:06 +0000 Subject: [PATCH 06/69] deleted test_between_time.py backup (duplicate) --- .../frame/methods/test_between_time copy.py | 209 ------------------ 1 file changed, 209 deletions(-) delete mode 100644 pandas/tests/frame/methods/test_between_time copy.py diff --git a/pandas/tests/frame/methods/test_between_time copy.py b/pandas/tests/frame/methods/test_between_time copy.py deleted file mode 100644 index 972c111ad66b8..0000000000000 --- a/pandas/tests/frame/methods/test_between_time copy.py +++ /dev/null @@ -1,209 +0,0 @@ -from datetime import ( - datetime, - time, -) - -import numpy as np -import pytest - -from pandas._libs.tslibs import timezones -import pandas.util._test_decorators as td - -from pandas import ( - DataFrame, - Series, - date_range, -) -import pandas._testing as tm - - -class TestBetweenTime: - @td.skip_if_has_locale - def test_between_time_formats(self, frame_or_series): - # GH#11818 - rng = date_range("1/1/2000", "1/5/2000", freq="5min") - ts = DataFrame(np.random.randn(len(rng), 2), index=rng) - if frame_or_series is Series: - ts = ts[0] - - strings = [ - ("2:00", "2:30"), - ("0200", "0230"), - ("2:00am", "2:30am"), - ("0200am", "0230am"), - ("2:00:00", "2:30:00"), - ("020000", "023000"), - ("2:00:00am", "2:30:00am"), - ("020000am", "023000am"), - ] - expected_length = 28 - - for time_string in strings: - assert len(ts.between_time(*time_string)) == expected_length - - @pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"]) - def test_localized_between_time(self, tzstr, frame_or_series): - tz = timezones.maybe_get_tz(tzstr) - - rng = date_range("4/16/2012", "5/1/2012", freq="H") - ts = Series(np.random.randn(len(rng)), index=rng) - if frame_or_series is DataFrame: - ts = ts.to_frame() - - ts_local = ts.tz_localize(tzstr) - - t1, t2 = time(10, 0), time(11, 0) - result = ts_local.between_time(t1, t2) - expected = ts.between_time(t1, t2).tz_localize(tzstr) - tm.assert_equal(result, expected) - assert timezones.tz_compare(result.index.tz, tz) - - def test_between_time_types(self, frame_or_series): - # GH11818 - rng = date_range("1/1/2000", "1/5/2000", freq="5min") - obj = DataFrame({"A": 0}, index=rng) - if frame_or_series is Series: - obj = obj["A"] - - msg = r"Cannot convert arg \[datetime\.datetime\(2010, 1, 2, 1, 0\)\] to a time" - with pytest.raises(ValueError, match=msg): - obj.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5)) - - def test_between_time(self, close_open_fixture, frame_or_series): - rng = date_range("1/1/2000", "1/5/2000", freq="5min") - ts = DataFrame(np.random.randn(len(rng), 2), index=rng) - if frame_or_series is not DataFrame: - ts = ts[0] - - stime = time(0, 0) - etime = time(1, 0) - inc_start, inc_end = close_open_fixture ## what is close_open_fixture - - filtered = ts.between_time(stime, etime, inc_start, inc_end) - exp_len = 13 * 4 + 1 - if not inc_start: - exp_len -= 5 - if not inc_end: - exp_len -= 4 - - assert len(filtered) == exp_len - for rs in filtered.index: - t = rs.time() - if inc_start: - assert t >= stime - else: - assert t > stime - - if inc_end: - assert t <= etime - else: - assert t < etime - - result = ts.between_time("00:00", "01:00") - expected = ts.between_time(stime, etime) - tm.assert_equal(result, expected) - - # across midnight - rng = date_range("1/1/2000", "1/5/2000", freq="5min") - ts = DataFrame(np.random.randn(len(rng), 2), index=rng) - if frame_or_series is not DataFrame: - ts = ts[0] - stime = time(22, 0) - etime = time(9, 0) - - filtered = ts.between_time(stime, etime, inc_start, inc_end) - exp_len = (12 * 11 + 1) * 4 + 1 - if not inc_start: - exp_len -= 4 - if not inc_end: - exp_len -= 4 - - assert len(filtered) == exp_len - for rs in filtered.index: - t = rs.time() - if inc_start: - assert (t >= stime) or (t <= etime) - else: - assert (t > stime) or (t <= etime) - - if inc_end: - assert (t <= etime) or (t >= stime) - else: - assert (t < etime) or (t >= stime) - - def test_between_time_raises(self, frame_or_series): - # GH#20725 - obj = DataFrame([[1, 2, 3], [4, 5, 6]]) - if frame_or_series is not DataFrame: - obj = obj[0] - - msg = "Index must be DatetimeIndex" - with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex - obj.between_time(start_time="00:00", end_time="12:00") - - def test_between_time_axis(self, frame_or_series): - # GH#8839 - rng = date_range("1/1/2000", periods=100, freq="10min") - ts = Series(np.random.randn(len(rng)), index=rng) - if frame_or_series is DataFrame: - ts = ts.to_frame() - - stime, etime = ("08:00:00", "09:00:00") - expected_length = 7 - - assert len(ts.between_time(stime, etime)) == expected_length - assert len(ts.between_time(stime, etime, axis=0)) == expected_length - msg = f"No axis named {ts.ndim} for object type {type(ts).__name__}" - with pytest.raises(ValueError, match=msg): - ts.between_time(stime, etime, axis=ts.ndim) - - def test_between_time_axis_aliases(self, axis): - # GH#8839 - rng = date_range("1/1/2000", periods=100, freq="10min") - ts = DataFrame(np.random.randn(len(rng), len(rng))) - stime, etime = ("08:00:00", "09:00:00") - exp_len = 7 - - if axis in ["index", 0]: - ts.index = rng - assert len(ts.between_time(stime, etime)) == exp_len - assert len(ts.between_time(stime, etime, axis=0)) == exp_len - - if axis in ["columns", 1]: - ts.columns = rng - selected = ts.between_time(stime, etime, axis=1).columns - assert len(selected) == exp_len - - def test_between_time_axis_raises(self, axis): - # issue 8839 - rng = date_range("1/1/2000", periods=100, freq="10min") - mask = np.arange(0, len(rng)) - rand_data = np.random.randn(len(rng), len(rng)) - ts = DataFrame(rand_data, index=rng, columns=rng) - stime, etime = ("08:00:00", "09:00:00") - - msg = "Index must be DatetimeIndex" - if axis in ["columns", 1]: - ts.index = mask - with pytest.raises(TypeError, match=msg): - ts.between_time(stime, etime) - with pytest.raises(TypeError, match=msg): - ts.between_time(stime, etime, axis=0) - - if axis in ["index", 0]: - ts.columns = mask - with pytest.raises(TypeError, match=msg): - ts.between_time(stime, etime, axis=1) - - def test_between_time_datetimeindex(self): - index = date_range("2012-01-01", "2012-01-05", freq="30min") - df = DataFrame(np.random.randn(len(index), 5), index=index) - bkey = slice(time(13, 0, 0), time(14, 0, 0)) - binds = [26, 27, 28, 74, 75, 76, 122, 123, 124, 170, 171, 172] - - result = df.between_time(bkey.start, bkey.stop) - expected = df.loc[bkey] - expected2 = df.iloc[binds] - tm.assert_frame_equal(result, expected) - tm.assert_frame_equal(result, expected2) - assert len(result) == 12 From a7032c4514b265de02a5dd17457ceda6090037c1 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:21:39 +0000 Subject: [PATCH 07/69] removed unused import --- pandas/tests/frame/conftest.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandas/tests/frame/conftest.py b/pandas/tests/frame/conftest.py index 17614d140ebef..bb8adc8fba315 100644 --- a/pandas/tests/frame/conftest.py +++ b/pandas/tests/frame/conftest.py @@ -1,5 +1,3 @@ -from itertools import product - import numpy as np import pytest From cb2ca4d1b60a961372a8c9987d9d06c212f9ab16 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:23:02 +0000 Subject: [PATCH 08/69] linting improvement --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index edabca948d2e2..32195e6e468f5 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7576,8 +7576,8 @@ def between_time( start_time, end_time, inclusive="both", - include_start= 'bool_t', - include_end= 'bool_t', + include_start="bool_t", + include_end="bool_t", axis=None, ) -> FrameOrSeries: """ From c7f24ded38ca13a10efef25f57b5ca8900c3bf0f Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:24:31 +0000 Subject: [PATCH 09/69] aremoved debug print statements --- pandas/tests/frame/methods/test_between_time.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index f7c6da692c85a..e809a06f52bbb 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -80,7 +80,6 @@ def test_between_time(self, close_open_fixture, frame_or_series): inclusive = close_open_fixture filtered = ts.between_time(stime, etime, inclusive) - print("\naa1", inclusive) exp_len = 13 * 4 + 1 if inclusive in ["right", "neither"]: @@ -114,7 +113,6 @@ def test_between_time(self, close_open_fixture, frame_or_series): etime = time(9, 0) filtered = ts.between_time(stime, etime, inclusive) - print("bb1", inclusive) exp_len = (12 * 11 + 1) * 4 + 1 if inclusive in ["right", "neither"]: exp_len -= 4 From 30be004e3851d89737ebb7a44200678ce36b585b Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:27:17 +0000 Subject: [PATCH 10/69] linting improvements --- pandas/core/generic.py | 2 +- pandas/tests/frame/methods/test_between_time.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 32195e6e468f5..1030dcb46189f 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7661,7 +7661,7 @@ def between_time( include_start = True if include_end == 'bool_t': include_end = True - else: # if depreciated args haven't been passed + else: # if depreciated args haven't been passed if inclusive == "both": include_start = True include_end = True diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index e809a06f52bbb..e5d64168329e5 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -82,9 +82,9 @@ def test_between_time(self, close_open_fixture, frame_or_series): filtered = ts.between_time(stime, etime, inclusive) exp_len = 13 * 4 + 1 - if inclusive in ["right", "neither"]: + if inclusive in ["right", "neither"]: exp_len -= 5 - if inclusive in ["left", "neither"]: + if inclusive in ["left", "neither"]: exp_len -= 4 assert len(filtered) == exp_len @@ -112,22 +112,22 @@ def test_between_time(self, close_open_fixture, frame_or_series): stime = time(22, 0) etime = time(9, 0) - filtered = ts.between_time(stime, etime, inclusive) + filtered = ts.between_time(stime, etime, inclusive) exp_len = (12 * 11 + 1) * 4 + 1 - if inclusive in ["right", "neither"]: + if inclusive in ["right", "neither"]: exp_len -= 4 - if inclusive in ["left", "neither"]: + if inclusive in ["left", "neither"]: exp_len -= 4 assert len(filtered) == exp_len for rs in filtered.index: t = rs.time() - if inclusive == "left" or inclusive == "both": + if inclusive == "left" or inclusive == "both": assert (t >= stime) or (t <= etime) else: assert (t > stime) or (t <= etime) - if inclusive == "right" or inclusive == "both": + if inclusive == "right" or inclusive == "both": assert (t <= etime) or (t >= stime) else: assert (t < etime) or (t >= stime) From 83cd360d155c7c6fe2688405cf457183c767f240 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 08:41:01 +0000 Subject: [PATCH 11/69] linting improvement --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 1030dcb46189f..3fb6cd3a936fc 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7650,7 +7650,7 @@ def between_time( raise TypeError("Index must be DatetimeIndex") # if depreciated arguments ('include_start', 'include_end') have been passed - if (include_start != 'bool_t') or (include_start != 'bool_t'): + if (include_start != 'bool_t') or (include_start != 'bool_t'): warnings.warn( "`include_start` and `include_end` are deprecated in" "favour of `inclusive`.", From c94b34d90fa221095e5c2e83bf302d9f0c472c6e Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 09:50:46 +0000 Subject: [PATCH 12/69] updated docstring for between_time() --- pandas/core/generic.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 8a9f3fd39063d..a2e8bd69a385c 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7592,10 +7592,8 @@ def between_time( Initial time as a time filter limit. end_time : datetime.time or str End time as a time filter limit. - include_start : bool, default True - Whether the start time needs to be included in the result. - include_end : bool, default True - Whether the end time needs to be included in the result. + inclusive: Include boundaries. Whether to set each bound as closed or open. + {"both", "neither", "left", "right"}, default "both" axis : {0 or 'index', 1 or 'columns'}, default 0 Determine range time on index or columns value. From 1e36cb2218c3836af57996a5ecedb750149a6618 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 09:57:36 +0000 Subject: [PATCH 13/69] made whats new entry --- doc/source/whatsnew/v1.4.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.4.0.rst b/doc/source/whatsnew/v1.4.0.rst index fc488504f1fdf..1d76ac7a5f99b 100644 --- a/doc/source/whatsnew/v1.4.0.rst +++ b/doc/source/whatsnew/v1.4.0.rst @@ -92,7 +92,7 @@ Other enhancements - :meth:`Series.sample`, :meth:`DataFrame.sample`, and :meth:`.GroupBy.sample` now accept a ``np.random.Generator`` as input to ``random_state``. A generator will be more performant, especially with ``replace=False`` (:issue:`38100`) - :meth:`Series.ewm`, :meth:`DataFrame.ewm`, now support a ``method`` argument with a ``'table'`` option that performs the windowing operation over an entire :class:`DataFrame`. See :ref:`Window Overview ` for performance and functional benefits (:issue:`42273`) - :meth:`.GroupBy.cummin` and :meth:`.GroupBy.cummax` now support the argument ``skipna`` (:issue:`34047`) -- +- :meth:`DataFrame.between_time` now accepts ``inclusive`` argument as ``{"both", "neither", "left", "right"}`` in place of ``include_start`` and ``include_end`` (:issue:`40245`) .. --------------------------------------------------------------------------- From 1e6361b1853e3a911217c5c7200781f87d76dfbd Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 27 Aug 2021 10:14:15 +0000 Subject: [PATCH 14/69] linting improvement --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index a2e8bd69a385c..30d986bc6a957 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7575,9 +7575,9 @@ def between_time( self: FrameOrSeries, start_time, end_time, - inclusive="both", + inclusive="both", include_start="bool_t", - include_end="bool_t", + include_end="bool_t", axis=None, ) -> FrameOrSeries: """ From 236b8c389821d5cdb117a418011ac7dc831e1571 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 28 Aug 2021 05:54:17 +0000 Subject: [PATCH 15/69] updated docstring for inclusive --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 30d986bc6a957..dc18dc63497af 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7592,8 +7592,8 @@ def between_time( Initial time as a time filter limit. end_time : datetime.time or str End time as a time filter limit. - inclusive: Include boundaries. Whether to set each bound as closed or open. - {"both", "neither", "left", "right"}, default "both" + inclusive: {"both", "neither", "left", "right"}, default "both" + Include boundaries; whether to set each bound as closed or open. axis : {0 or 'index', 1 or 'columns'}, default 0 Determine range time on index or columns value. From 01bf00e5dd417175acfbcd94fc6de2ffa379eec4 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 28 Aug 2021 09:40:42 +0000 Subject: [PATCH 16/69] making if statements consistent --- pandas/tests/frame/methods/test_between_time.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index e5d64168329e5..6ff7e59c57eeb 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -122,12 +122,12 @@ def test_between_time(self, close_open_fixture, frame_or_series): assert len(filtered) == exp_len for rs in filtered.index: t = rs.time() - if inclusive == "left" or inclusive == "both": + if inclusive in ["left", "both"]: assert (t >= stime) or (t <= etime) else: assert (t > stime) or (t <= etime) - if inclusive == "right" or inclusive == "both": + if inclusive in ["right", "both"]: assert (t <= etime) or (t >= stime) else: assert (t < etime) or (t >= stime) From 5b35ac7889beeab61ab1efe18f258f5f1ef39c58 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 30 Aug 2021 14:44:20 +0000 Subject: [PATCH 17/69] precommit hook added --- .github/.pre-commit-config.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/.pre-commit-config.yaml diff --git a/.github/.pre-commit-config.yaml b/.github/.pre-commit-config.yaml new file mode 100644 index 0000000000000..e69de29bb2d1d From ce00141d2fc85c8a868bd00ece361762e6be0454 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 30 Aug 2021 15:24:03 +0000 Subject: [PATCH 18/69] modified gitignore as per review --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index 4c683e1dc452d..2c337be60e94e 100644 --- a/.gitignore +++ b/.gitignore @@ -120,6 +120,3 @@ doc/build/html/index.html doc/tmp.sv env/ doc/source/savefig/ - -# Env created by suyash -myenv/ From 99f35c30480b7c20f5d48b05fef7fcd9bbdccfc2 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 30 Aug 2021 15:30:18 +0000 Subject: [PATCH 19/69] deleted .github/.pre-commit-config.yaml as per review --- .github/.pre-commit-config.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .github/.pre-commit-config.yaml diff --git a/.github/.pre-commit-config.yaml b/.github/.pre-commit-config.yaml deleted file mode 100644 index e69de29bb2d1d..0000000000000 From 101c0c226b39c0e90e3919736914950f837277be Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 30 Aug 2021 15:46:11 +0000 Subject: [PATCH 20/69] bool_t: reconverted from string to annotation as per review --- pandas/core/generic.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index dc18dc63497af..7c58d50bbf32f 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7576,8 +7576,8 @@ def between_time( start_time, end_time, inclusive="both", - include_start="bool_t", - include_end="bool_t", + include_start=bool_t, + include_end=bool_t, axis=None, ) -> FrameOrSeries: """ @@ -7648,16 +7648,16 @@ def between_time( raise TypeError("Index must be DatetimeIndex") # if depreciated arguments ('include_start', 'include_end') have been passed - if (include_start != 'bool_t') or (include_start != 'bool_t'): + if (include_start != bool_t) or (include_start != bool_t): warnings.warn( "`include_start` and `include_end` are deprecated in" "favour of `inclusive`.", FutureWarning, stacklevel=2, ) - if include_start == 'bool_t': + if include_start == bool_t: include_start = True - if include_end == 'bool_t': + if include_end == bool_t: include_end = True else: # if depreciated args haven't been passed if inclusive == "both": From d447d6b53996da37c15700abb8c4f30a243b0591 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 30 Aug 2021 16:32:56 +0000 Subject: [PATCH 21/69] used lib.no_default as per review --- pandas/core/generic.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index b74a32652e16b..72296d9f50dcd 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7608,8 +7608,8 @@ def between_time( start_time, end_time, inclusive="both", - include_start=bool_t, - include_end=bool_t, + include_start=lib.no_default, + include_end=lib.no_default, axis=None, ) -> FrameOrSeries: """ @@ -7679,17 +7679,18 @@ def between_time( if not isinstance(index, DatetimeIndex): raise TypeError("Index must be DatetimeIndex") - # if depreciated arguments ('include_start', 'include_end') have been passed - if (include_start != bool_t) or (include_start != bool_t): + # if any of the depreciated arguments ('include_start', 'include_end') + # have been passed + if (include_start != lib.no_default) or (include_end != lib.no_default): warnings.warn( "`include_start` and `include_end` are deprecated in" "favour of `inclusive`.", FutureWarning, stacklevel=2, ) - if include_start == bool_t: + if include_start == lib.no_default: include_start = True - if include_end == bool_t: + if include_end == lib.no_default: include_end = True else: # if depreciated args haven't been passed if inclusive == "both": From 69a28917acf83221662650725d4579ab8f61616e Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 09:54:07 +0000 Subject: [PATCH 22/69] preccommit hook changes --- pandas/tests/frame/conftest.py | 7 ++ .../tests/frame/methods/test_between_time.py | 69 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/pandas/tests/frame/conftest.py b/pandas/tests/frame/conftest.py index bb8adc8fba315..f177050904610 100644 --- a/pandas/tests/frame/conftest.py +++ b/pandas/tests/frame/conftest.py @@ -1,3 +1,5 @@ +from itertools import product + import numpy as np import pytest @@ -14,6 +16,11 @@ def close_open_fixture(request): return request.param +@pytest.fixture(params=product([True, False], [True, False])) +def close_open_fixture_warn(request): + return request.param + + @pytest.fixture def float_frame_with_na(): """ diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 6ff7e59c57eeb..dccb2985a5958 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -208,3 +208,72 @@ def test_between_time_datetimeindex(self): tm.assert_frame_equal(result, expected) tm.assert_frame_equal(result, expected2) assert len(result) == 12 + + # GH40245 + def test_between_time_warn(self, close_open_fixture_warn, frame_or_series): + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + if frame_or_series is not DataFrame: + ts = ts[0] + + stime = time(0, 0) + etime = time(1, 0) + inc_start, inc_end = close_open_fixture_warn + + with tm.assert_produces_warning(FutureWarning): + filtered = ts.between_time( + stime, etime, include_start=inc_start, include_end=inc_end + ) + exp_len = 13 * 4 + 1 + if not inc_start: + exp_len -= 5 + if not inc_end: + exp_len -= 4 + + assert len(filtered) == exp_len + for rs in filtered.index: + t = rs.time() + if inc_start: + assert t >= stime + else: + assert t > stime + + if inc_end: + assert t <= etime + else: + assert t < etime + + result = ts.between_time("00:00", "01:00") + expected = ts.between_time(stime, etime) + tm.assert_equal(result, expected) + + # across midnight + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + if frame_or_series is not DataFrame: + ts = ts[0] + stime = time(22, 0) + etime = time(9, 0) + + with tm.assert_produces_warning(FutureWarning): + filtered = ts.between_time( + stime, etime, include_start=inc_start, include_end=inc_end + ) + exp_len = (12 * 11 + 1) * 4 + 1 + if not inc_start: + exp_len -= 4 + if not inc_end: + exp_len -= 4 + + assert len(filtered) == exp_len + for rs in filtered.index: + t = rs.time() + if inc_start: + assert (t >= stime) or (t <= etime) + else: + assert (t > stime) or (t <= etime) + + if inc_end: + assert (t <= etime) or (t >= stime) + else: + assert (t < etime) or (t >= stime) From 226b961b1eeb90c491b9ec92559ebf943125066a Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 10:00:46 +0000 Subject: [PATCH 23/69] removed venv files --- doc/source/whatsnew/v1.4.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v1.4.0.rst b/doc/source/whatsnew/v1.4.0.rst index 382180684cca4..2f8f46a04b169 100644 --- a/doc/source/whatsnew/v1.4.0.rst +++ b/doc/source/whatsnew/v1.4.0.rst @@ -231,6 +231,7 @@ Deprecations - Deprecated dropping of nuisance columns in :class:`Rolling`, :class:`Expanding`, and :class:`EWM` aggregations (:issue:`42738`) - Deprecated :meth:`Index.reindex` with a non-unique index (:issue:`42568`) - Deprecated :meth:`.Styler.render` in favour of :meth:`.Styler.to_html` (:issue:`42140`) +- Deprecated the 'include_start' and 'include_end' arguments in :meth:`DataFrame.between_time`; in a future version passing 'include_start' or 'include_end' will raise (:issue:`40245`) .. --------------------------------------------------------------------------- From 2bb5c5a43308198d34c9b5a3afa6654ae2150620 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 16:15:38 +0530 Subject: [PATCH 24/69] Update pandas/core/generic.py to preserve args order Co-authored-by: JHM Darbyshire <24256554+attack68@users.noreply.github.com> --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 72296d9f50dcd..b61f80554603a 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7607,10 +7607,10 @@ def between_time( self: FrameOrSeries, start_time, end_time, - inclusive="both", include_start=lib.no_default, include_end=lib.no_default, axis=None, + inclusive="both", ) -> FrameOrSeries: """ Select values between particular times of the day (e.g., 9:00-9:30 AM). From 06d964ca8318ee9cdf3133d734387c05d4a06424 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 16:16:26 +0530 Subject: [PATCH 25/69] Update pandas/core/generic.py to preserve args order in docstring Co-authored-by: JHM Darbyshire <24256554+attack68@users.noreply.github.com> --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index b61f80554603a..702314d551c62 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7624,10 +7624,10 @@ def between_time( Initial time as a time filter limit. end_time : datetime.time or str End time as a time filter limit. - inclusive: {"both", "neither", "left", "right"}, default "both" - Include boundaries; whether to set each bound as closed or open. axis : {0 or 'index', 1 or 'columns'}, default 0 Determine range time on index or columns value. + inclusive: {"both", "neither", "left", "right"}, default "both" + Include boundaries; whether to set each bound as closed or open. Returns ------- From 49468571c0376ef3d21cf9977f34a989bb7505d1 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 16:17:46 +0530 Subject: [PATCH 26/69] Update pandas/core/generic.py as per suggestion Co-authored-by: JHM Darbyshire <24256554+attack68@users.noreply.github.com> --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 702314d551c62..cca67f4da87b7 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7712,7 +7712,7 @@ def between_time( ) indexer = index.indexer_between_time( - start_time, end_time, include_start=include_start, include_end=include_end + start_time, end_time, include_start=inclusive in ["both", "left"], include_end=inclusive in ["both", "right"] ) return self._take_with_is_copy(indexer, axis=axis) From 8df4bb6ecdbc0aa7b881129db76676b2dfa97936 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 10:53:47 +0000 Subject: [PATCH 27/69] linting improvement --- pandas/core/generic.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index cca67f4da87b7..7686277fb4a7f 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7712,7 +7712,10 @@ def between_time( ) indexer = index.indexer_between_time( - start_time, end_time, include_start=inclusive in ["both", "left"], include_end=inclusive in ["both", "right"] + start_time, + end_time, + include_start=inclusive in ["both", "left"], + include_end=inclusive in ["both", "right"], ) return self._take_with_is_copy(indexer, axis=axis) From 3dcfd0bf678c76899a6ec308fc9312ba10f10ca2 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 11:12:32 +0000 Subject: [PATCH 28/69] test_between_time modified to accomodate previous review changes --- .../tests/frame/methods/test_between_time.py | 59 +------------------ 1 file changed, 3 insertions(+), 56 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index dccb2985a5958..a5d974dcb4d47 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -79,7 +79,7 @@ def test_between_time(self, close_open_fixture, frame_or_series): etime = time(1, 0) inclusive = close_open_fixture - filtered = ts.between_time(stime, etime, inclusive) + filtered = ts.between_time(stime, etime, inclusive=inclusive) exp_len = 13 * 4 + 1 if inclusive in ["right", "neither"]: @@ -112,7 +112,7 @@ def test_between_time(self, close_open_fixture, frame_or_series): stime = time(22, 0) etime = time(9, 0) - filtered = ts.between_time(stime, etime, inclusive) + filtered = ts.between_time(stime, etime, inclusive=inclusive) exp_len = (12 * 11 + 1) * 4 + 1 if inclusive in ["right", "neither"]: exp_len -= 4 @@ -221,59 +221,6 @@ def test_between_time_warn(self, close_open_fixture_warn, frame_or_series): inc_start, inc_end = close_open_fixture_warn with tm.assert_produces_warning(FutureWarning): - filtered = ts.between_time( + _ = ts.between_time( stime, etime, include_start=inc_start, include_end=inc_end ) - exp_len = 13 * 4 + 1 - if not inc_start: - exp_len -= 5 - if not inc_end: - exp_len -= 4 - - assert len(filtered) == exp_len - for rs in filtered.index: - t = rs.time() - if inc_start: - assert t >= stime - else: - assert t > stime - - if inc_end: - assert t <= etime - else: - assert t < etime - - result = ts.between_time("00:00", "01:00") - expected = ts.between_time(stime, etime) - tm.assert_equal(result, expected) - - # across midnight - rng = date_range("1/1/2000", "1/5/2000", freq="5min") - ts = DataFrame(np.random.randn(len(rng), 2), index=rng) - if frame_or_series is not DataFrame: - ts = ts[0] - stime = time(22, 0) - etime = time(9, 0) - - with tm.assert_produces_warning(FutureWarning): - filtered = ts.between_time( - stime, etime, include_start=inc_start, include_end=inc_end - ) - exp_len = (12 * 11 + 1) * 4 + 1 - if not inc_start: - exp_len -= 4 - if not inc_end: - exp_len -= 4 - - assert len(filtered) == exp_len - for rs in filtered.index: - t = rs.time() - if inc_start: - assert (t >= stime) or (t <= etime) - else: - assert (t > stime) or (t <= etime) - - if inc_end: - assert (t <= etime) or (t >= stime) - else: - assert (t < etime) or (t >= stime) From 7dbc6c43d6b58464baed8544f17af76d346d1832 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 16:08:03 +0000 Subject: [PATCH 29/69] updated docstring for CI error --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 7686277fb4a7f..8080acf3dd000 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7610,7 +7610,7 @@ def between_time( include_start=lib.no_default, include_end=lib.no_default, axis=None, - inclusive="both", + inclusive: str = "both", ) -> FrameOrSeries: """ Select values between particular times of the day (e.g., 9:00-9:30 AM). From ccd35cd266f9d7122e6870a61e2bc2df6b43dd76 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 17:54:21 +0000 Subject: [PATCH 30/69] removed fixture as per review --- pandas/tests/frame/conftest.py | 12 ------------ pandas/tests/frame/methods/test_between_time.py | 9 +++++---- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/pandas/tests/frame/conftest.py b/pandas/tests/frame/conftest.py index f177050904610..3729f921f59ad 100644 --- a/pandas/tests/frame/conftest.py +++ b/pandas/tests/frame/conftest.py @@ -1,5 +1,3 @@ -from itertools import product - import numpy as np import pytest @@ -11,16 +9,6 @@ import pandas._testing as tm -@pytest.fixture(params=["both", "neither", "left", "right"]) -def close_open_fixture(request): - return request.param - - -@pytest.fixture(params=product([True, False], [True, False])) -def close_open_fixture_warn(request): - return request.param - - @pytest.fixture def float_frame_with_na(): """ diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index a5d974dcb4d47..4f5485e3233bb 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -69,7 +69,8 @@ def test_between_time_types(self, frame_or_series): with pytest.raises(ValueError, match=msg): obj.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5)) - def test_between_time(self, close_open_fixture, frame_or_series): + @pytest.mark.parametrize("inclusive", ["both", "neither", "left", "right"]) + def test_between_time(self, inclusive, frame_or_series): rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) if frame_or_series is not DataFrame: @@ -77,7 +78,6 @@ def test_between_time(self, close_open_fixture, frame_or_series): stime = time(0, 0) etime = time(1, 0) - inclusive = close_open_fixture filtered = ts.between_time(stime, etime, inclusive=inclusive) exp_len = 13 * 4 + 1 @@ -210,7 +210,9 @@ def test_between_time_datetimeindex(self): assert len(result) == 12 # GH40245 - def test_between_time_warn(self, close_open_fixture_warn, frame_or_series): + @pytest.mark.parametrize("inc_start", (True, False)) + @pytest.mark.parametrize("inc_end", (True, False)) + def test_between_time_warn(self, inc_start, inc_end, frame_or_series): rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) if frame_or_series is not DataFrame: @@ -218,7 +220,6 @@ def test_between_time_warn(self, close_open_fixture_warn, frame_or_series): stime = time(0, 0) etime = time(1, 0) - inc_start, inc_end = close_open_fixture_warn with tm.assert_produces_warning(FutureWarning): _ = ts.between_time( From f255d5ef34a7f5acad022cfa59123e543109b8a2 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 31 Aug 2021 17:55:43 +0000 Subject: [PATCH 31/69] removed redundant msg as per review --- doc/source/whatsnew/v1.4.0.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/source/whatsnew/v1.4.0.rst b/doc/source/whatsnew/v1.4.0.rst index cff377e409a08..05d5c3f875e0b 100644 --- a/doc/source/whatsnew/v1.4.0.rst +++ b/doc/source/whatsnew/v1.4.0.rst @@ -95,7 +95,6 @@ Other enhancements - :meth:`Series.sample`, :meth:`DataFrame.sample`, and :meth:`.GroupBy.sample` now accept a ``np.random.Generator`` as input to ``random_state``. A generator will be more performant, especially with ``replace=False`` (:issue:`38100`) - :meth:`Series.ewm`, :meth:`DataFrame.ewm`, now support a ``method`` argument with a ``'table'`` option that performs the windowing operation over an entire :class:`DataFrame`. See :ref:`Window Overview ` for performance and functional benefits (:issue:`42273`) - :meth:`.GroupBy.cummin` and :meth:`.GroupBy.cummax` now support the argument ``skipna`` (:issue:`34047`) -- :meth:`DataFrame.between_time` now accepts ``inclusive`` argument as ``{"both", "neither", "left", "right"}`` in place of ``include_start`` and ``include_end`` (:issue:`40245`) - :meth:`read_table` now supports the argument ``storage_options`` (:issue:`39167`) From e9f109fedd5ad602b3220f77f95c01f290fb7866 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Wed, 1 Sep 2021 07:08:01 +0000 Subject: [PATCH 32/69] removed redundant code --- pandas/core/generic.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 8080acf3dd000..6c5089ef0036b 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7693,19 +7693,7 @@ def between_time( if include_end == lib.no_default: include_end = True else: # if depreciated args haven't been passed - if inclusive == "both": - include_start = True - include_end = True - elif inclusive == "neither": - include_start = False - include_end = False - elif inclusive == "left": - include_start = True - include_end = False - elif inclusive == "right": - include_start = False - include_end = True - else: + if inclusive not in ["both", "neither", "left", "right"]: raise ValueError( "Inclusive has to be either string of 'both'," "'left', 'right', or 'neither'." From c1f3f864453cfb6d25c094e045d877b87753a397 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Wed, 1 Sep 2021 07:59:53 +0000 Subject: [PATCH 33/69] error when user passes both new and depreciated args --- pandas/core/generic.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 6c5089ef0036b..a6a24c468e341 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7610,7 +7610,7 @@ def between_time( include_start=lib.no_default, include_end=lib.no_default, axis=None, - inclusive: str = "both", + inclusive: str = "", ) -> FrameOrSeries: """ Select values between particular times of the day (e.g., 9:00-9:30 AM). @@ -7679,9 +7679,18 @@ def between_time( if not isinstance(index, DatetimeIndex): raise TypeError("Index must be DatetimeIndex") - # if any of the depreciated arguments ('include_start', 'include_end') + # If user has passed any of the depreciated arguments + # ('include_start', 'include_end') AND the new argument ('inclusive') + if (include_start != lib.no_default or include_end != lib.no_default) and ( + inclusive != "" + ): + raise ValueError( + "`inclusive` cannot be passed if either or both of `include_start`," + "`include_end` is passed." + ) + # If any of the depreciated arguments ('include_start', 'include_end') # have been passed - if (include_start != lib.no_default) or (include_end != lib.no_default): + elif (include_start != lib.no_default) or (include_end != lib.no_default): warnings.warn( "`include_start` and `include_end` are deprecated in" "favour of `inclusive`.", @@ -7693,7 +7702,9 @@ def between_time( if include_end == lib.no_default: include_end = True else: # if depreciated args haven't been passed - if inclusive not in ["both", "neither", "left", "right"]: + if inclusive == "": + inclusive = "both" + elif inclusive not in ["both", "neither", "left", "right"]: raise ValueError( "Inclusive has to be either string of 'both'," "'left', 'right', or 'neither'." From b26cc5c1813037ede963c236094763d91bdb1e7f Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Wed, 1 Sep 2021 09:32:48 +0000 Subject: [PATCH 34/69] changed default value of inclusive to None fromm empty str --- pandas/core/generic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index a6a24c468e341..04e8b320a5299 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7610,7 +7610,7 @@ def between_time( include_start=lib.no_default, include_end=lib.no_default, axis=None, - inclusive: str = "", + inclusive=None, ) -> FrameOrSeries: """ Select values between particular times of the day (e.g., 9:00-9:30 AM). @@ -7682,7 +7682,7 @@ def between_time( # If user has passed any of the depreciated arguments # ('include_start', 'include_end') AND the new argument ('inclusive') if (include_start != lib.no_default or include_end != lib.no_default) and ( - inclusive != "" + inclusive is not None ): raise ValueError( "`inclusive` cannot be passed if either or both of `include_start`," @@ -7702,7 +7702,7 @@ def between_time( if include_end == lib.no_default: include_end = True else: # if depreciated args haven't been passed - if inclusive == "": + if inclusive is None: inclusive = "both" elif inclusive not in ["both", "neither", "left", "right"]: raise ValueError( From 5e3e19343df1a220e38cacb00e7429a63f7dce0e Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Thu, 2 Sep 2021 16:41:57 +0000 Subject: [PATCH 35/69] ValueError message changed when both depreciated args and new args passed --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 04e8b320a5299..0b786685fa4cc 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7685,8 +7685,8 @@ def between_time( inclusive is not None ): raise ValueError( - "`inclusive` cannot be passed if either or both of `include_start`," - "`include_end` is passed." + "Depreciated arguments `include_start` and `include_end`" + "cannot be passed if `inclusive` has been given." ) # If any of the depreciated arguments ('include_start', 'include_end') # have been passed From 3bcb185a47c40fd5e75185482b246e385b417b96 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Thu, 2 Sep 2021 16:49:35 +0000 Subject: [PATCH 36/69] comment updated when inclusive defaults to both --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 0b786685fa4cc..cf5da2d8205be 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7701,7 +7701,7 @@ def between_time( include_start = True if include_end == lib.no_default: include_end = True - else: # if depreciated args haven't been passed + else: # On arg removal inclusive can default to "both" if inclusive is None: inclusive = "both" elif inclusive not in ["both", "neither", "left", "right"]: From 63975b49ffec4ca93916d23f37d3d40764bf8001 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Thu, 2 Sep 2021 17:03:12 +0000 Subject: [PATCH 37/69] added deprecated directive for include_start and include_end --- pandas/core/generic.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index cf5da2d8205be..50dc913342840 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7624,6 +7624,20 @@ def between_time( Initial time as a time filter limit. end_time : datetime.time or str End time as a time filter limit. + include_start : bool + Whether the start time needs to be included in the result. + + .. deprecated:: 0.21.0 + Arguments `include_start` and `include_end` have been deprecated + to standardize boundary inputs. Use `inclusive` instead to set + each bound as close or open. + include_end : bool + Whether the end time needs to be included in the result. + + .. deprecated:: 0.21.0 + Arguments `include_start` and `include_end` have been deprecated + to standardize boundary inputs. Use `inclusive` instead to set + each bound as close or open. axis : {0 or 'index', 1 or 'columns'}, default 0 Determine range time on index or columns value. inclusive: {"both", "neither", "left", "right"}, default "both" From 50cc20cf368cf108dcda5b5a912b20ba1dca4f17 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Thu, 2 Sep 2021 17:04:31 +0000 Subject: [PATCH 38/69] deprecated directive updated --- pandas/core/generic.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 50dc913342840..4107c0399e705 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7628,16 +7628,16 @@ def between_time( Whether the start time needs to be included in the result. .. deprecated:: 0.21.0 - Arguments `include_start` and `include_end` have been deprecated - to standardize boundary inputs. Use `inclusive` instead to set - each bound as close or open. + Arguments `include_start` and `include_end` have been deprecated + to standardize boundary inputs. Use `inclusive` instead, to set + each bound as close or open. include_end : bool Whether the end time needs to be included in the result. .. deprecated:: 0.21.0 - Arguments `include_start` and `include_end` have been deprecated - to standardize boundary inputs. Use `inclusive` instead to set - each bound as close or open. + Arguments `include_start` and `include_end` have been deprecated + to standardize boundary inputs. Use `inclusive` instead, to set + each bound as close or open. axis : {0 or 'index', 1 or 'columns'}, default 0 Determine range time on index or columns value. inclusive: {"both", "neither", "left", "right"}, default "both" From 4b6d817179d090d72ab4a49f24479da3ffe67304 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Thu, 2 Sep 2021 17:06:12 +0000 Subject: [PATCH 39/69] version corrected in depreciate directive --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 4107c0399e705..526bbd1e37407 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7627,14 +7627,14 @@ def between_time( include_start : bool Whether the start time needs to be included in the result. - .. deprecated:: 0.21.0 + .. deprecated:: 1.4.0 Arguments `include_start` and `include_end` have been deprecated to standardize boundary inputs. Use `inclusive` instead, to set each bound as close or open. include_end : bool Whether the end time needs to be included in the result. - .. deprecated:: 0.21.0 + .. deprecated:: 1.4.0 Arguments `include_start` and `include_end` have been deprecated to standardize boundary inputs. Use `inclusive` instead, to set each bound as close or open. From 17453490202da9c2085f58f9f4cb0257db0fe5fc Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 3 Sep 2021 04:47:08 +0000 Subject: [PATCH 40/69] Updated ValueError message as per review --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 526bbd1e37407..d46a96136e756 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7720,8 +7720,8 @@ def between_time( inclusive = "both" elif inclusive not in ["both", "neither", "left", "right"]: raise ValueError( - "Inclusive has to be either string of 'both'," - "'left', 'right', or 'neither'." + f"Inclusive has to be either string of 'both'," + f"'left', 'right', or 'neither'. Got {inclusive}." ) indexer = index.indexer_between_time( From da075f336029eee12f30f52c448fab501e771be9 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 3 Sep 2021 09:05:29 +0000 Subject: [PATCH 41/69] updated docstring for between_time --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index d46a96136e756..e656cc8ba0949 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7640,7 +7640,7 @@ def between_time( each bound as close or open. axis : {0 or 'index', 1 or 'columns'}, default 0 Determine range time on index or columns value. - inclusive: {"both", "neither", "left", "right"}, default "both" + inclusive : {"both", "neither", "left", "right"}, default "both" Include boundaries; whether to set each bound as closed or open. Returns From 14e5450c43e59c34c51d9f8ccade8d9d7315143e Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 09:43:48 +0000 Subject: [PATCH 42/69] test_between_time_incorr_arg_inclusive added --- pandas/tests/frame/methods/test_between_time.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 4f5485e3233bb..cbf9c1fed6a9f 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -225,3 +225,15 @@ def test_between_time_warn(self, inc_start, inc_end, frame_or_series): _ = ts.between_time( stime, etime, include_start=inc_start, include_end=inc_end ) + + # GH40245 + def test_between_time_incorr_arg_inclusive(self): + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + + stime = time(0, 0) + etime = time(1, 0) + inclusive = "neeither" + msg = "Inclusive has to be either string of 'both','left', 'right', or 'neither'. Got neeither." + with pytest.raises(ValueError, match=msg): + ts.between_time(stime, etime, inclusive=inclusive) \ No newline at end of file From 8987d17d3e8ada412746571002dd5fb8e4ac8326 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 10:07:21 +0000 Subject: [PATCH 43/69] tests added --- .../tests/frame/methods/test_between_time.py | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index cbf9c1fed6a9f..3d23dc1e06419 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -234,6 +234,25 @@ def test_between_time_incorr_arg_inclusive(self): stime = time(0, 0) etime = time(1, 0) inclusive = "neeither" - msg = "Inclusive has to be either string of 'both','left', 'right', or 'neither'. Got neeither." + msg = ( + "Inclusive has to be either string of 'both','left', 'right', " + "or 'neither'. Got neeither." + ) with pytest.raises(ValueError, match=msg): - ts.between_time(stime, etime, inclusive=inclusive) \ No newline at end of file + ts.between_time(stime, etime, inclusive=inclusive) + + # GH40245 + def test_between_time_incompatiable_args_given_together(self): + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + + stime = time(0, 0) + etime = time(1, 0) + inclusive = "left" + include_start = True + msg = ( + "Depreciated arguments `include_start` and `include_end`cannot be " + "passed if `inclusive` has been given." + ) + with pytest.raises(ValueError, match=msg): + ts.between_time(stime, etime, include_start, inclusive=inclusive) From 693ad71e5540aa2ade362cfd15a7eea4dccaa294 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 11:51:49 +0000 Subject: [PATCH 44/69] depreciated -> deprecated --- pandas/core/generic.py | 6 +++--- pandas/tests/frame/methods/test_between_time.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index e656cc8ba0949..9eb0242f2489b 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7693,16 +7693,16 @@ def between_time( if not isinstance(index, DatetimeIndex): raise TypeError("Index must be DatetimeIndex") - # If user has passed any of the depreciated arguments + # If user has passed any of the deprecated arguments # ('include_start', 'include_end') AND the new argument ('inclusive') if (include_start != lib.no_default or include_end != lib.no_default) and ( inclusive is not None ): raise ValueError( - "Depreciated arguments `include_start` and `include_end`" + "Deprecated arguments `include_start` and `include_end`" "cannot be passed if `inclusive` has been given." ) - # If any of the depreciated arguments ('include_start', 'include_end') + # If any of the deprecated arguments ('include_start', 'include_end') # have been passed elif (include_start != lib.no_default) or (include_end != lib.no_default): warnings.warn( diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 3d23dc1e06419..eb731dc8de0f5 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -251,7 +251,7 @@ def test_between_time_incompatiable_args_given_together(self): inclusive = "left" include_start = True msg = ( - "Depreciated arguments `include_start` and `include_end`cannot be " + "Deprecated arguments `include_start` and `include_end`cannot be " "passed if `inclusive` has been given." ) with pytest.raises(ValueError, match=msg): From f49126b3b935a591ee530a99a3fc7da0433a60a6 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 11:53:32 +0000 Subject: [PATCH 45/69] default type for inclusive mentioned as str --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 9eb0242f2489b..e26fc8ca5fcf6 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7610,7 +7610,7 @@ def between_time( include_start=lib.no_default, include_end=lib.no_default, axis=None, - inclusive=None, + inclusive: str | None = None, ) -> FrameOrSeries: """ Select values between particular times of the day (e.g., 9:00-9:30 AM). From 6951d252edc9ff32b0f9822f5ccd21128c134df6 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 12:05:14 +0000 Subject: [PATCH 46/69] added message to match for FutureWarning in test_between_time_warn --- pandas/tests/frame/methods/test_between_time.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index eb731dc8de0f5..c678341fd08e5 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -221,7 +221,11 @@ def test_between_time_warn(self, inc_start, inc_end, frame_or_series): stime = time(0, 0) etime = time(1, 0) - with tm.assert_produces_warning(FutureWarning): + match = ( + "`include_start` and `include_end` " + "are deprecated infavour of `inclusive`." + ) + with tm.assert_produces_warning(FutureWarning, match=match): _ = ts.between_time( stime, etime, include_start=inc_start, include_end=inc_end ) From 0569ce3ec3458a66102e3ee662539a048b2bf187 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 12:07:39 +0000 Subject: [PATCH 47/69] typo fix: added space to a ValueError message --- pandas/core/generic.py | 2 +- pandas/tests/frame/methods/test_between_time.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index e26fc8ca5fcf6..8c51a09bd8846 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7699,7 +7699,7 @@ def between_time( inclusive is not None ): raise ValueError( - "Deprecated arguments `include_start` and `include_end`" + "Deprecated arguments `include_start` and `include_end` " "cannot be passed if `inclusive` has been given." ) # If any of the deprecated arguments ('include_start', 'include_end') diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index c678341fd08e5..08b243d072a94 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -255,7 +255,7 @@ def test_between_time_incompatiable_args_given_together(self): inclusive = "left" include_start = True msg = ( - "Deprecated arguments `include_start` and `include_end`cannot be " + "Deprecated arguments `include_start` and `include_end` cannot be " "passed if `inclusive` has been given." ) with pytest.raises(ValueError, match=msg): From 8d5d8c61fad08239372f8296c8dcecdc40f8770f Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 14:05:08 +0000 Subject: [PATCH 48/69] default values updated for include_start, include_end --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 8c51a09bd8846..f66bc71bc4d69 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7607,8 +7607,8 @@ def between_time( self: FrameOrSeries, start_time, end_time, - include_start=lib.no_default, - include_end=lib.no_default, + include_start: bool_t | lib.NoDefault = lib.no_default, + include_end: bool_t | lib.NoDefault = lib.no_default, axis=None, inclusive: str | None = None, ) -> FrameOrSeries: From faabfdb8df4d3778f3dc07c469cd211b9134ef4d Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 17:18:44 +0000 Subject: [PATCH 49/69] added missing functionality, modified test case for it --- pandas/core/generic.py | 14 +++-- .../tests/frame/methods/test_between_time.py | 57 ++++++++++++++++++- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index f66bc71bc4d69..e77fae00bfc59 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7711,10 +7711,16 @@ def between_time( FutureWarning, stacklevel=2, ) - if include_start == lib.no_default: - include_start = True - if include_end == lib.no_default: - include_end = True + if (include_start == lib.no_default and include_end == lib.no_default) or ( + include_start is True and include_end is True + ): + inclusive = "both" + elif include_start is False and include_end is False: + inclusive = "neither" + elif include_start is True and include_end is False: + inclusive = "left" + elif include_start is False and include_end is True: + inclusive = "right" else: # On arg removal inclusive can default to "both" if inclusive is None: inclusive = "both" diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 08b243d072a94..03fd68e99a2c4 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -226,9 +226,60 @@ def test_between_time_warn(self, inc_start, inc_end, frame_or_series): "are deprecated infavour of `inclusive`." ) with tm.assert_produces_warning(FutureWarning, match=match): - _ = ts.between_time( - stime, etime, include_start=inc_start, include_end=inc_end - ) + filtered = ts.between_time(stime, etime, inc_start, inc_end) + + # new new new + exp_len = 13 * 4 + 1 + if not inc_start: + exp_len -= 5 + if not inc_end: + exp_len -= 4 + + assert len(filtered) == exp_len + # for rs in filtered.index: + # t = rs.time() + # if inc_start: + # assert t >= stime + # else: + # assert t > stime + + # if inc_end: + # assert t <= etime + # else: + # assert t < etime + + # result = ts.between_time("00:00", "01:00") + # expected = ts.between_time(stime, etime) + # tm.assert_equal(result, expected) + + # # across midnight + # rng = date_range("1/1/2000", "1/5/2000", freq="5min") + # ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + # if frame_or_series is not DataFrame: + # ts = ts[0] + # stime = time(22, 0) + # etime = time(9, 0) + + # with tm.assert_produces_warning(FutureWarning): + # filtered = ts.between_time(stime, etime, inc_start, inc_end) + # exp_len = (12 * 11 + 1) * 4 + 1 + # if not inc_start: + # exp_len -= 4 + # if not inc_end: + # exp_len -= 4 + + # assert len(filtered) == exp_len + # for rs in filtered.index: + # t = rs.time() + # if inc_start: + # assert (t >= stime) or (t <= etime) + # else: + # assert (t > stime) or (t <= etime) + + # if inc_end: + # assert (t <= etime) or (t >= stime) + # else: + # assert (t < etime) or (t >= stime) # GH40245 def test_between_time_incorr_arg_inclusive(self): From 12c787d11242b7490ef4466aab46962470dbe303 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 17:28:29 +0000 Subject: [PATCH 50/69] modified between_time as per suggestion --- pandas/core/generic.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index e77fae00bfc59..c256dc30399e9 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7711,16 +7711,15 @@ def between_time( FutureWarning, stacklevel=2, ) - if (include_start == lib.no_default and include_end == lib.no_default) or ( - include_start is True and include_end is True - ): - inclusive = "both" - elif include_start is False and include_end is False: - inclusive = "neither" - elif include_start is True and include_end is False: - inclusive = "left" - elif include_start is False and include_end is True: - inclusive = "right" + left = 1 if include_start == lib.no_default else int(include_start) + right = 1 if include_end == lib.no_default else int(include_end) + inc_dict = { + (1, 1): "both", + (1, 0): "left", + (0, 1): "right", + (0, 0): "neither", + } + inclusive = inc_dict[(left, right)] else: # On arg removal inclusive can default to "both" if inclusive is None: inclusive = "both" From 5dae3f03191c7fb2d5f6ae2ada2cd81413a9d323 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Sat, 4 Sep 2021 23:12:19 +0530 Subject: [PATCH 51/69] Removed incorrect spaces from docstring for correct rendering Co-authored-by: JHM Darbyshire <24256554+attack68@users.noreply.github.com> --- pandas/core/generic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index c256dc30399e9..076eb9afc278c 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7628,9 +7628,9 @@ def between_time( Whether the start time needs to be included in the result. .. deprecated:: 1.4.0 - Arguments `include_start` and `include_end` have been deprecated - to standardize boundary inputs. Use `inclusive` instead, to set - each bound as close or open. + Arguments `include_start` and `include_end` have been deprecated + to standardize boundary inputs. Use `inclusive` instead, to set + each bound as close or open. include_end : bool Whether the end time needs to be included in the result. From 241c6a751f214829b076d5ec68ac42256061940b Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 6 Sep 2021 14:42:11 +0530 Subject: [PATCH 52/69] Modified test_between_time_incorr_arg_inclusive as per suggestion Co-authored-by: JHM Darbyshire <24256554+attack68@users.noreply.github.com> --- pandas/tests/frame/methods/test_between_time.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 03fd68e99a2c4..bcf5653a5c173 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -288,10 +288,10 @@ def test_between_time_incorr_arg_inclusive(self): stime = time(0, 0) etime = time(1, 0) - inclusive = "neeither" + inclusive = "bad_string" msg = ( "Inclusive has to be either string of 'both','left', 'right', " - "or 'neither'. Got neeither." + "or 'neither'. Got bad_string." ) with pytest.raises(ValueError, match=msg): ts.between_time(stime, etime, inclusive=inclusive) From c0f0ada2db3492c0e6afde956069a0703b0d9887 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 6 Sep 2021 10:10:54 +0000 Subject: [PATCH 53/69] test_between_time_incompatiable_args_given parametrized --- .../tests/frame/methods/test_between_time.py | 64 ++----------------- 1 file changed, 6 insertions(+), 58 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index bcf5653a5c173..3c123a86872bc 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -226,60 +226,7 @@ def test_between_time_warn(self, inc_start, inc_end, frame_or_series): "are deprecated infavour of `inclusive`." ) with tm.assert_produces_warning(FutureWarning, match=match): - filtered = ts.between_time(stime, etime, inc_start, inc_end) - - # new new new - exp_len = 13 * 4 + 1 - if not inc_start: - exp_len -= 5 - if not inc_end: - exp_len -= 4 - - assert len(filtered) == exp_len - # for rs in filtered.index: - # t = rs.time() - # if inc_start: - # assert t >= stime - # else: - # assert t > stime - - # if inc_end: - # assert t <= etime - # else: - # assert t < etime - - # result = ts.between_time("00:00", "01:00") - # expected = ts.between_time(stime, etime) - # tm.assert_equal(result, expected) - - # # across midnight - # rng = date_range("1/1/2000", "1/5/2000", freq="5min") - # ts = DataFrame(np.random.randn(len(rng), 2), index=rng) - # if frame_or_series is not DataFrame: - # ts = ts[0] - # stime = time(22, 0) - # etime = time(9, 0) - - # with tm.assert_produces_warning(FutureWarning): - # filtered = ts.between_time(stime, etime, inc_start, inc_end) - # exp_len = (12 * 11 + 1) * 4 + 1 - # if not inc_start: - # exp_len -= 4 - # if not inc_end: - # exp_len -= 4 - - # assert len(filtered) == exp_len - # for rs in filtered.index: - # t = rs.time() - # if inc_start: - # assert (t >= stime) or (t <= etime) - # else: - # assert (t > stime) or (t <= etime) - - # if inc_end: - # assert (t <= etime) or (t >= stime) - # else: - # assert (t < etime) or (t >= stime) + _ = ts.between_time(stime, etime, inc_start, inc_end) # GH40245 def test_between_time_incorr_arg_inclusive(self): @@ -297,17 +244,18 @@ def test_between_time_incorr_arg_inclusive(self): ts.between_time(stime, etime, inclusive=inclusive) # GH40245 - def test_between_time_incompatiable_args_given_together(self): + @pytest.mark.parametrize( + "include_start, include_end", [(True, None), (True, True), (None, True)] + ) + def test_between_time_incompatiable_args_given(self, include_start, include_end): rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) stime = time(0, 0) etime = time(1, 0) - inclusive = "left" - include_start = True msg = ( "Deprecated arguments `include_start` and `include_end` cannot be " "passed if `inclusive` has been given." ) with pytest.raises(ValueError, match=msg): - ts.between_time(stime, etime, include_start, inclusive=inclusive) + ts.between_time(stime, etime, include_start, include_end, inclusive="left") From e883702e03937f437706b81527bf84980f3a5767 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 6 Sep 2021 11:05:42 +0000 Subject: [PATCH 54/69] test added to assert functionality on both old, new args --- .../tests/frame/methods/test_between_time.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 3c123a86872bc..124ff5c168d87 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -259,3 +259,38 @@ def test_between_time_incompatiable_args_given(self, include_start, include_end) ) with pytest.raises(ValueError, match=msg): ts.between_time(stime, etime, include_start, include_end, inclusive="left") + + # GH40245 + def test_between_time_same_functionality_old_and_new_args(self): + rng = date_range("1/1/2000", "1/5/2000", freq="5min") + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) + stime = time(0, 0) + etime = time(1, 0) + match = ( + "`include_start` and `include_end` " + "are deprecated infavour of `inclusive`." + ) + + x1 = ts.between_time(stime, etime) + y1 = ts.between_time(stime, etime, inclusive="both") + assert x1.equals(y1) + + with tm.assert_produces_warning(FutureWarning, match=match): + x2 = ts.between_time(stime, etime, include_start=False) + y2 = ts.between_time(stime, etime, inclusive="right") + assert x2.equals(y2) + + with tm.assert_produces_warning(FutureWarning, match=match): + x3 = ts.between_time(stime, etime, include_end=False) + y3 = ts.between_time(stime, etime, inclusive="left") + assert x3.equals(y3) + + with tm.assert_produces_warning(FutureWarning, match=match): + x4 = ts.between_time(stime, etime, include_start=False, include_end=False) + y4 = ts.between_time(stime, etime, inclusive="neither") + assert x4.equals(y4) + + with tm.assert_produces_warning(FutureWarning, match=match): + x5 = ts.between_time(stime, etime, include_start=True, include_end=True) + y5 = ts.between_time(stime, etime, inclusive="both") + assert x5.equals(y5) From bb613534c2c48001f93dd6bebc84a5c9bc2fab2f Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 6 Sep 2021 11:11:13 +0000 Subject: [PATCH 55/69] infavour -> in favour --- pandas/core/generic.py | 2 +- pandas/tests/frame/methods/test_between_time.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 076eb9afc278c..75550987faedf 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7706,7 +7706,7 @@ def between_time( # have been passed elif (include_start != lib.no_default) or (include_end != lib.no_default): warnings.warn( - "`include_start` and `include_end` are deprecated in" + "`include_start` and `include_end` are deprecated in " "favour of `inclusive`.", FutureWarning, stacklevel=2, diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 124ff5c168d87..d0feb0cf2eca0 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -223,7 +223,7 @@ def test_between_time_warn(self, inc_start, inc_end, frame_or_series): match = ( "`include_start` and `include_end` " - "are deprecated infavour of `inclusive`." + "are deprecated in favour of `inclusive`." ) with tm.assert_produces_warning(FutureWarning, match=match): _ = ts.between_time(stime, etime, inc_start, inc_end) @@ -268,7 +268,7 @@ def test_between_time_same_functionality_old_and_new_args(self): etime = time(1, 0) match = ( "`include_start` and `include_end` " - "are deprecated infavour of `inclusive`." + "are deprecated in favour of `inclusive`." ) x1 = ts.between_time(stime, etime) From 605e14409a474f3a10a080fb05001d60ce975ba3 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 6 Sep 2021 16:43:54 +0530 Subject: [PATCH 56/69] docstring update as per suggestion Co-authored-by: JHM Darbyshire <24256554+attack68@users.noreply.github.com> --- pandas/core/generic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 076eb9afc278c..24e5430a49761 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7635,9 +7635,9 @@ def between_time( Whether the end time needs to be included in the result. .. deprecated:: 1.4.0 - Arguments `include_start` and `include_end` have been deprecated - to standardize boundary inputs. Use `inclusive` instead, to set - each bound as close or open. + Arguments `include_start` and `include_end` have been deprecated + to standardize boundary inputs. Use `inclusive` instead, to set + each bound as close or open. axis : {0 or 'index', 1 or 'columns'}, default 0 Determine range time on index or columns value. inclusive : {"both", "neither", "left", "right"}, default "both" From 38a2aa16511ea2eca5de73e986f56ed4780ed3cf Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Mon, 6 Sep 2021 14:08:02 +0000 Subject: [PATCH 57/69] mpyerror fixed --- pandas/core/generic.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index bebd8f38a77f3..9141f2a36ada4 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7711,8 +7711,9 @@ def between_time( FutureWarning, stacklevel=2, ) - left = 1 if include_start == lib.no_default else int(include_start) - right = 1 if include_end == lib.no_default else int(include_end) + left = 1 if isinstance(include_start, lib.NoDefault) else int(include_start) + right = 1 if isinstance(include_end, lib.NoDefault) else int(include_end) + inc_dict = { (1, 1): "both", (1, 0): "left", From dcafe0ce81e8592aec6548d6d417d49465f64bb6 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 7 Sep 2021 05:40:14 +0000 Subject: [PATCH 58/69] changed order of args as per suggestion in between_time --- pandas/core/generic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 9141f2a36ada4..62ea472882add 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7609,8 +7609,8 @@ def between_time( end_time, include_start: bool_t | lib.NoDefault = lib.no_default, include_end: bool_t | lib.NoDefault = lib.no_default, - axis=None, inclusive: str | None = None, + axis=None, ) -> FrameOrSeries: """ Select values between particular times of the day (e.g., 9:00-9:30 AM). @@ -7638,10 +7638,10 @@ def between_time( Arguments `include_start` and `include_end` have been deprecated to standardize boundary inputs. Use `inclusive` instead, to set each bound as close or open. - axis : {0 or 'index', 1 or 'columns'}, default 0 - Determine range time on index or columns value. inclusive : {"both", "neither", "left", "right"}, default "both" Include boundaries; whether to set each bound as closed or open. + axis : {0 or 'index', 1 or 'columns'}, default 0 + Determine range time on index or columns value. Returns ------- From 84543b8046996fe6bba9880a34da9d7d71e312b0 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 7 Sep 2021 05:53:29 +0000 Subject: [PATCH 59/69] replaced parametrize with fixture as per suggestion in test_between_time --- pandas/tests/frame/conftest.py | 5 +++++ pandas/tests/frame/methods/test_between_time.py | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pandas/tests/frame/conftest.py b/pandas/tests/frame/conftest.py index 3729f921f59ad..92f81ff3a00fa 100644 --- a/pandas/tests/frame/conftest.py +++ b/pandas/tests/frame/conftest.py @@ -9,6 +9,11 @@ import pandas._testing as tm +@pytest.fixture(params=["both", "neither", "left", "right"]) +def inclusive_endpoints_fixture(request): + return request.param + + @pytest.fixture def float_frame_with_na(): """ diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index d0feb0cf2eca0..ff40f76b9955b 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -69,8 +69,7 @@ def test_between_time_types(self, frame_or_series): with pytest.raises(ValueError, match=msg): obj.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5)) - @pytest.mark.parametrize("inclusive", ["both", "neither", "left", "right"]) - def test_between_time(self, inclusive, frame_or_series): + def test_between_time(self, inclusive_endpoints_fixture, frame_or_series): rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) if frame_or_series is not DataFrame: @@ -78,6 +77,7 @@ def test_between_time(self, inclusive, frame_or_series): stime = time(0, 0) etime = time(1, 0) + inclusive = inclusive_endpoints_fixture filtered = ts.between_time(stime, etime, inclusive=inclusive) exp_len = 13 * 4 + 1 From 48bd780c22c8097a7b1d38a089de62e771340349 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 7 Sep 2021 05:59:45 +0000 Subject: [PATCH 60/69] readability update in test_between_time.py --- pandas/tests/frame/methods/test_between_time.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index ff40f76b9955b..bd0a8c811989d 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -210,9 +210,9 @@ def test_between_time_datetimeindex(self): assert len(result) == 12 # GH40245 - @pytest.mark.parametrize("inc_start", (True, False)) - @pytest.mark.parametrize("inc_end", (True, False)) - def test_between_time_warn(self, inc_start, inc_end, frame_or_series): + @pytest.mark.parametrize("include_start", [True, False]) + @pytest.mark.parametrize("include_end", [True, False]) + def test_between_time_warn(self, include_start, include_end, frame_or_series): rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) if frame_or_series is not DataFrame: @@ -226,7 +226,7 @@ def test_between_time_warn(self, inc_start, inc_end, frame_or_series): "are deprecated in favour of `inclusive`." ) with tm.assert_produces_warning(FutureWarning, match=match): - _ = ts.between_time(stime, etime, inc_start, inc_end) + _ = ts.between_time(stime, etime, include_start, include_end) # GH40245 def test_between_time_incorr_arg_inclusive(self): From 6eb02d7befa3f919ca9e86c581ae51f1c2c418a6 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 7 Sep 2021 06:01:22 +0000 Subject: [PATCH 61/69] comment # GH40245 shifted inside test definitions --- pandas/tests/frame/methods/test_between_time.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index bd0a8c811989d..7d2e1a88174f1 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -209,10 +209,10 @@ def test_between_time_datetimeindex(self): tm.assert_frame_equal(result, expected2) assert len(result) == 12 - # GH40245 @pytest.mark.parametrize("include_start", [True, False]) @pytest.mark.parametrize("include_end", [True, False]) def test_between_time_warn(self, include_start, include_end, frame_or_series): + # GH40245 rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) if frame_or_series is not DataFrame: @@ -228,8 +228,8 @@ def test_between_time_warn(self, include_start, include_end, frame_or_series): with tm.assert_produces_warning(FutureWarning, match=match): _ = ts.between_time(stime, etime, include_start, include_end) - # GH40245 def test_between_time_incorr_arg_inclusive(self): + # GH40245 rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) @@ -243,11 +243,11 @@ def test_between_time_incorr_arg_inclusive(self): with pytest.raises(ValueError, match=msg): ts.between_time(stime, etime, inclusive=inclusive) - # GH40245 @pytest.mark.parametrize( "include_start, include_end", [(True, None), (True, True), (None, True)] ) def test_between_time_incompatiable_args_given(self, include_start, include_end): + # GH40245 rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) @@ -260,8 +260,8 @@ def test_between_time_incompatiable_args_given(self, include_start, include_end) with pytest.raises(ValueError, match=msg): ts.between_time(stime, etime, include_start, include_end, inclusive="left") - # GH40245 def test_between_time_same_functionality_old_and_new_args(self): + # GH40245 rng = date_range("1/1/2000", "1/5/2000", freq="5min") ts = DataFrame(np.random.randn(len(rng), 2), index=rng) stime = time(0, 0) From 519113b760de6f665bd2c30f30b488ed3b1e8a33 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 7 Sep 2021 06:09:04 +0000 Subject: [PATCH 62/69] readability update x,y -> result, expected --- .../tests/frame/methods/test_between_time.py | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 7d2e1a88174f1..7c02166a33710 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -271,26 +271,28 @@ def test_between_time_same_functionality_old_and_new_args(self): "are deprecated in favour of `inclusive`." ) - x1 = ts.between_time(stime, etime) - y1 = ts.between_time(stime, etime, inclusive="both") - assert x1.equals(y1) + result = ts.between_time(stime, etime) + expected = ts.between_time(stime, etime, inclusive="both") + assert result.equals(expected) with tm.assert_produces_warning(FutureWarning, match=match): - x2 = ts.between_time(stime, etime, include_start=False) - y2 = ts.between_time(stime, etime, inclusive="right") - assert x2.equals(y2) + result = ts.between_time(stime, etime, include_start=False) + expected = ts.between_time(stime, etime, inclusive="right") + assert result.equals(expected) with tm.assert_produces_warning(FutureWarning, match=match): - x3 = ts.between_time(stime, etime, include_end=False) - y3 = ts.between_time(stime, etime, inclusive="left") - assert x3.equals(y3) + result = ts.between_time(stime, etime, include_end=False) + expected = ts.between_time(stime, etime, inclusive="left") + assert result.equals(expected) with tm.assert_produces_warning(FutureWarning, match=match): - x4 = ts.between_time(stime, etime, include_start=False, include_end=False) - y4 = ts.between_time(stime, etime, inclusive="neither") - assert x4.equals(y4) + result = ts.between_time( + stime, etime, include_start=False, include_end=False + ) + expected = ts.between_time(stime, etime, inclusive="neither") + assert result.equals(expected) with tm.assert_produces_warning(FutureWarning, match=match): - x5 = ts.between_time(stime, etime, include_start=True, include_end=True) - y5 = ts.between_time(stime, etime, inclusive="both") - assert x5.equals(y5) + result = ts.between_time(stime, etime, include_start=True, include_end=True) + expected = ts.between_time(stime, etime, inclusive="both") + assert result.equals(expected) From b7014302bdb72b274082cdf05d11c4164ad1ab47 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 7 Sep 2021 06:19:04 +0000 Subject: [PATCH 63/69] used assert_frame_equal ito compare frames --- pandas/tests/frame/methods/test_between_time.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 7c02166a33710..5bb584c333110 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -273,26 +273,26 @@ def test_between_time_same_functionality_old_and_new_args(self): result = ts.between_time(stime, etime) expected = ts.between_time(stime, etime, inclusive="both") - assert result.equals(expected) + tm.assert_frame_equal(result, expected) with tm.assert_produces_warning(FutureWarning, match=match): result = ts.between_time(stime, etime, include_start=False) expected = ts.between_time(stime, etime, inclusive="right") - assert result.equals(expected) + tm.assert_frame_equal(result, expected) with tm.assert_produces_warning(FutureWarning, match=match): result = ts.between_time(stime, etime, include_end=False) expected = ts.between_time(stime, etime, inclusive="left") - assert result.equals(expected) + tm.assert_frame_equal(result, expected) with tm.assert_produces_warning(FutureWarning, match=match): result = ts.between_time( stime, etime, include_start=False, include_end=False ) expected = ts.between_time(stime, etime, inclusive="neither") - assert result.equals(expected) + tm.assert_frame_equal(result, expected) with tm.assert_produces_warning(FutureWarning, match=match): result = ts.between_time(stime, etime, include_start=True, include_end=True) expected = ts.between_time(stime, etime, inclusive="both") - assert result.equals(expected) + tm.assert_frame_equal(result, expected) From 938d39a32d3fd76b23d892004eeed9f36c385664 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Tue, 7 Sep 2021 06:33:14 +0000 Subject: [PATCH 64/69] updated generic.py --- pandas/core/generic.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 62ea472882add..a58f8b941f64f 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7711,14 +7711,14 @@ def between_time( FutureWarning, stacklevel=2, ) - left = 1 if isinstance(include_start, lib.NoDefault) else int(include_start) - right = 1 if isinstance(include_end, lib.NoDefault) else int(include_end) + left = True if isinstance(include_start, lib.NoDefault) else include_start + right = True if isinstance(include_end, lib.NoDefault) else include_end inc_dict = { - (1, 1): "both", - (1, 0): "left", - (0, 1): "right", - (0, 0): "neither", + (True, True): "both", + (True, False): "left", + (False, True): "right", + (False, False): "neither", } inclusive = inc_dict[(left, right)] else: # On arg removal inclusive can default to "both" From fdfa53f9ec1cd4a799fccc7032f1aee19721521b Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Wed, 8 Sep 2021 05:40:20 +0000 Subject: [PATCH 65/69] removed comment as per suggestion --- pandas/core/generic.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index a58f8b941f64f..adf4b918e921f 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7693,8 +7693,6 @@ def between_time( if not isinstance(index, DatetimeIndex): raise TypeError("Index must be DatetimeIndex") - # If user has passed any of the deprecated arguments - # ('include_start', 'include_end') AND the new argument ('inclusive') if (include_start != lib.no_default or include_end != lib.no_default) and ( inclusive is not None ): From 0796bc423fa51a262ec7090a9bcdaf3f5c1b1526 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Wed, 8 Sep 2021 08:11:10 +0000 Subject: [PATCH 66/69] added , default True iin docstring for inc_start, inc_end in between_time --- pandas/core/generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index adf4b918e921f..25bc48cec3347 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7624,14 +7624,14 @@ def between_time( Initial time as a time filter limit. end_time : datetime.time or str End time as a time filter limit. - include_start : bool + include_start : bool, default True Whether the start time needs to be included in the result. .. deprecated:: 1.4.0 Arguments `include_start` and `include_end` have been deprecated to standardize boundary inputs. Use `inclusive` instead, to set each bound as close or open. - include_end : bool + include_end : bool, default True Whether the end time needs to be included in the result. .. deprecated:: 1.4.0 From b1fa8d6e6934ef173dfc182829e7ddaa916e7131 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 10 Sep 2021 19:34:11 +0530 Subject: [PATCH 67/69] close -> closed as per suggestion Co-authored-by: Marco Edward Gorelli --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 25bc48cec3347..d532193d5ecbb 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7630,7 +7630,7 @@ def between_time( .. deprecated:: 1.4.0 Arguments `include_start` and `include_end` have been deprecated to standardize boundary inputs. Use `inclusive` instead, to set - each bound as close or open. + each bound as closed or open. include_end : bool, default True Whether the end time needs to be included in the result. From 6c10418cde6154ab19718b128d5a332ea3406af9 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 10 Sep 2021 19:35:19 +0530 Subject: [PATCH 68/69] close -> closed as per suggestion Co-authored-by: Marco Edward Gorelli --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index d532193d5ecbb..3ff0f7fb57331 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7637,7 +7637,7 @@ def between_time( .. deprecated:: 1.4.0 Arguments `include_start` and `include_end` have been deprecated to standardize boundary inputs. Use `inclusive` instead, to set - each bound as close or open. + each bound as closed or open. inclusive : {"both", "neither", "left", "right"}, default "both" Include boundaries; whether to set each bound as closed or open. axis : {0 or 'index', 1 or 'columns'}, default 0 From 186b7a3a627d27e7feb17498bd20483a3e57c012 Mon Sep 17 00:00:00 2001 From: Suyash Gupta Date: Fri, 10 Sep 2021 14:09:17 +0000 Subject: [PATCH 69/69] added a space in ValueError msg for readability --- pandas/core/generic.py | 2 +- pandas/tests/frame/methods/test_between_time.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 25bc48cec3347..d7ae39b9f0566 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -7724,7 +7724,7 @@ def between_time( inclusive = "both" elif inclusive not in ["both", "neither", "left", "right"]: raise ValueError( - f"Inclusive has to be either string of 'both'," + f"Inclusive has to be either string of 'both', " f"'left', 'right', or 'neither'. Got {inclusive}." ) diff --git a/pandas/tests/frame/methods/test_between_time.py b/pandas/tests/frame/methods/test_between_time.py index 5bb584c333110..ae1aaaaf75d9b 100644 --- a/pandas/tests/frame/methods/test_between_time.py +++ b/pandas/tests/frame/methods/test_between_time.py @@ -237,7 +237,7 @@ def test_between_time_incorr_arg_inclusive(self): etime = time(1, 0) inclusive = "bad_string" msg = ( - "Inclusive has to be either string of 'both','left', 'right', " + "Inclusive has to be either string of 'both', 'left', 'right', " "or 'neither'. Got bad_string." ) with pytest.raises(ValueError, match=msg):