From 83e99cfb1464f03bcfa1bcf0a09f1775c5d13001 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Wed, 25 Oct 2017 10:54:55 -0500 Subject: [PATCH 1/3] PERF: Fix regression in datetime ops MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HEAD: ``` In [1]: import pandas as pd; import numpy as np In [2]: s = pd.Series(pd.to_datetime(np.arange(100000), unit='ms')) In [3]: %timeit s - s.shift() 2.73 ms ± 30.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) ``` 0.21.0rc1: ``` 527 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) ``` 0.20.3 ``` 2.4 ms ± 57.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) ``` --- pandas/core/ops.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pandas/core/ops.py b/pandas/core/ops.py index b6fc47c04f174..5d69990f17838 100644 --- a/pandas/core/ops.py +++ b/pandas/core/ops.py @@ -622,6 +622,9 @@ def _is_offset(self, arr_or_obj): """ check if obj or all elements of list-like is DateOffset """ if isinstance(arr_or_obj, ABCDateOffset): return True + elif is_datetime64_dtype(arr_or_obj): + # Don't want to check elementwise for Series / array of datetime + return False elif is_list_like(arr_or_obj) and len(arr_or_obj): return all(isinstance(x, ABCDateOffset) for x in arr_or_obj) return False From c5d27510e3f6f165aef563b22134c02e7cf077be Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Wed, 25 Oct 2017 10:59:28 -0500 Subject: [PATCH 2/3] timedelta too --- pandas/core/ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/core/ops.py b/pandas/core/ops.py index 5d69990f17838..210306a359458 100644 --- a/pandas/core/ops.py +++ b/pandas/core/ops.py @@ -622,7 +622,8 @@ def _is_offset(self, arr_or_obj): """ check if obj or all elements of list-like is DateOffset """ if isinstance(arr_or_obj, ABCDateOffset): return True - elif is_datetime64_dtype(arr_or_obj): + elif (is_datetime64_dtype(arr_or_obj) or + is_timedelta64_dtype(arr_or_obj)): # Don't want to check elementwise for Series / array of datetime return False elif is_list_like(arr_or_obj) and len(arr_or_obj): From d0ea5dcb4351c76341f7d8c1785c9e789452316d Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Thu, 26 Oct 2017 06:10:29 -0500 Subject: [PATCH 3/3] Clean up the fix --- pandas/core/ops.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pandas/core/ops.py b/pandas/core/ops.py index 210306a359458..fa50036b6eb95 100644 --- a/pandas/core/ops.py +++ b/pandas/core/ops.py @@ -622,11 +622,8 @@ def _is_offset(self, arr_or_obj): """ check if obj or all elements of list-like is DateOffset """ if isinstance(arr_or_obj, ABCDateOffset): return True - elif (is_datetime64_dtype(arr_or_obj) or - is_timedelta64_dtype(arr_or_obj)): - # Don't want to check elementwise for Series / array of datetime - return False - elif is_list_like(arr_or_obj) and len(arr_or_obj): + elif (is_list_like(arr_or_obj) and len(arr_or_obj) and + is_object_dtype(arr_or_obj)): return all(isinstance(x, ABCDateOffset) for x in arr_or_obj) return False