From 2c4dc5c74c2485a28450804d078ca872e1494868 Mon Sep 17 00:00:00 2001 From: Mike Kelly Date: Sat, 11 Oct 2014 17:14:48 -0400 Subject: [PATCH] PERF: Performance improvement for MultiIndexes with a DatetimeIndex level --- doc/source/v0.15.0.txt | 1 + pandas/core/index.py | 5 +++-- vb_suite/index_object.py | 13 +++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/doc/source/v0.15.0.txt b/doc/source/v0.15.0.txt index 9735202327d3b..ff96df1d087a9 100644 --- a/doc/source/v0.15.0.txt +++ b/doc/source/v0.15.0.txt @@ -932,6 +932,7 @@ Performance - Performance improvement in writing to sql (``to_sql``) of up to 50% (:issue:`8208`). - Performance benchmarking of groupby for large value of ngroups (:issue:`6787`) - Performance improvement in ``CustomBusinessDay``, ``CustomBusinessMonth`` (:issue:`8236`) +- Performance improvement for ``MultiIndex.values`` for multi-level indexes containing datetimes (:issue:`8543`) diff --git a/pandas/core/index.py b/pandas/core/index.py index b9f1a06b171ed..919018977cb80 100644 --- a/pandas/core/index.py +++ b/pandas/core/index.py @@ -2937,10 +2937,11 @@ def values(self): values = [] for lev, lab in zip(self.levels, self.labels): - taken = com.take_1d(lev.values, lab) + lev_values = lev.values # Need to box timestamps, etc. if hasattr(lev, '_box_values'): - taken = lev._box_values(taken) + lev_values = lev._box_values(lev_values) + taken = com.take_1d(lev_values, lab) values.append(taken) self._tuples = lib.fast_zip(values) diff --git a/vb_suite/index_object.py b/vb_suite/index_object.py index 5ddb2fb0ac7ec..de60a44e23a52 100644 --- a/vb_suite/index_object.py +++ b/vb_suite/index_object.py @@ -117,3 +117,16 @@ multiindex_from_product = Benchmark('MultiIndex.from_product(iterables)', setup, name='multiindex_from_product', start_date=datetime(2014, 6, 30)) + +#---------------------------------------------------------------------- +# MultiIndex with DatetimeIndex level + +setup = common_setup + """ +level1 = range(1000) +level2 = date_range(start='1/1/2012', periods=10) +""" + +multiindex_with_datetime_level = \ + Benchmark("MultiIndex.from_product([level1, level2]).values", setup, + name='multiindex_with_datetime_level', + start_date=datetime(2014, 10, 11))