From 8303bb20fd714ee99d8ce7389b8151357b428ebe Mon Sep 17 00:00:00 2001 From: Chris Kerr Date: Wed, 8 Nov 2017 14:52:50 +0100 Subject: [PATCH 1/3] Allow using '+' sign in the argument to to_offset() --- pandas/_libs/tslibs/frequencies.pyx | 2 +- pandas/tests/tseries/test_frequencies.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pandas/_libs/tslibs/frequencies.pyx b/pandas/_libs/tslibs/frequencies.pyx index 9d810bfb411af..2a700d52eaaf3 100644 --- a/pandas/_libs/tslibs/frequencies.pyx +++ b/pandas/_libs/tslibs/frequencies.pyx @@ -15,7 +15,7 @@ from util cimport is_integer_object # hack to handle WOM-1MON opattern = re.compile( - r'([\-]?\d*|[\-]?\d*\.\d*)\s*([A-Za-z]+([\-][\dA-Za-z\-]+)?)' + r'([+\-]?\d*|[+\-]?\d*\.\d*)\s*([A-Za-z]+([\-][\dA-Za-z\-]+)?)' ) _INVALID_FREQ_ERROR = "Invalid frequency: {0}" diff --git a/pandas/tests/tseries/test_frequencies.py b/pandas/tests/tseries/test_frequencies.py index 39a9a87141753..cc26424f0f0e9 100644 --- a/pandas/tests/tseries/test_frequencies.py +++ b/pandas/tests/tseries/test_frequencies.py @@ -169,6 +169,15 @@ def test_to_offset_leading_zero(self): result = frequencies.to_offset(freqstr) assert (result.n == -194) + def test_to_offset_leading_plus(self): + freqstr = '+1d' + result = frequencies.to_offset(freqstr) + assert (result.n == 1) + + freqstr = '+2h30min' + result = frequencies.to_offset(freqstr) + assert (result.n == 150) + def test_to_offset_pd_timedelta(self): # Tests for #9064 td = Timedelta(days=1, seconds=1) From 9d104c567daafde1d674ee033e0eca166672dad5 Mon Sep 17 00:00:00 2001 From: Chris Kerr Date: Thu, 9 Nov 2017 17:58:57 +0100 Subject: [PATCH 2/3] Added tests that invalid frequencies are recognized as invalid --- pandas/tests/tseries/test_frequencies.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pandas/tests/tseries/test_frequencies.py b/pandas/tests/tseries/test_frequencies.py index cc26424f0f0e9..745f3ef2ec5cb 100644 --- a/pandas/tests/tseries/test_frequencies.py +++ b/pandas/tests/tseries/test_frequencies.py @@ -178,6 +178,10 @@ def test_to_offset_leading_plus(self): result = frequencies.to_offset(freqstr) assert (result.n == 150) + for bad_freq in ['+-1d', '-+1h', '+1', '-7', '+d', '-m']: + with tm.assert_raises_regex(ValueError, 'Invalid frequency:'): + frequencies.to_offset(bad_freq) + def test_to_offset_pd_timedelta(self): # Tests for #9064 td = Timedelta(days=1, seconds=1) From 5d0b363c0665209fad69a085a51e0df0353c91f9 Mon Sep 17 00:00:00 2001 From: Chris Kerr Date: Thu, 9 Nov 2017 18:03:22 +0100 Subject: [PATCH 3/3] Describe changes in whatsnew.txt --- doc/source/whatsnew/v0.22.0.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.22.0.txt b/doc/source/whatsnew/v0.22.0.txt index 943b6bb84fb47..6bc4530f6d786 100644 --- a/doc/source/whatsnew/v0.22.0.txt +++ b/doc/source/whatsnew/v0.22.0.txt @@ -23,7 +23,7 @@ Other Enhancements ^^^^^^^^^^^^^^^^^^ - Better support for ``Dataframe.style.to_excel()`` output with the ``xlsxwriter`` engine. (:issue:`16149`) -- +- :func:`pd.tseries.frequencies.to_offset()` now accepts leading '+' signs e.g. '+1h'. (:issue:`18171`) - .. _whatsnew_0220.api_breaking: