diff --git a/doc/source/v0.15.0.txt b/doc/source/v0.15.0.txt index d776848de40d0..e8203a6b74933 100644 --- a/doc/source/v0.15.0.txt +++ b/doc/source/v0.15.0.txt @@ -152,6 +152,7 @@ There are no experimental changes in 0.15.0 Bug Fixes ~~~~~~~~~ +- Bug in ``DatetimeIndex``, ``__iter__`` creates a temp array of ``Timestamp`` (:issue:`7683`) diff --git a/pandas/core/base.py b/pandas/core/base.py index ce078eb91735d..33beaa58affda 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -387,6 +387,9 @@ def _ops_compat(self, name, op_accessor): is_year_start = _field_accessor('is_year_start', "Logical indicating if first day of year (defined by frequency)") is_year_end = _field_accessor('is_year_end', "Logical indicating if last day of year (defined by frequency)") + def __iter__(self): + return (self._box_func(v) for v in self.asi8) + @property def _box_func(self): """ diff --git a/pandas/tseries/index.py b/pandas/tseries/index.py index de758c4c8a579..704a6a7d1ddec 100644 --- a/pandas/tseries/index.py +++ b/pandas/tseries/index.py @@ -1476,9 +1476,6 @@ def normalize(self): return DatetimeIndex(new_values, freq='infer', name=self.name, tz=self.tz) - def __iter__(self): - return iter(self.asobject) - def searchsorted(self, key, side='left'): if isinstance(key, np.ndarray): key = np.array(key, dtype=_NS_DTYPE, copy=False) diff --git a/pandas/tseries/period.py b/pandas/tseries/period.py index cceac61f392a8..a94a45a5cc501 100644 --- a/pandas/tseries/period.py +++ b/pandas/tseries/period.py @@ -738,10 +738,6 @@ def astype(self, dtype): return Index(self.values, dtype) raise ValueError('Cannot cast PeriodIndex to dtype %s' % dtype) - def __iter__(self): - for val in self.values: - yield Period(ordinal=val, freq=self.freq) - def searchsorted(self, key, side='left'): if isinstance(key, compat.string_types): key = Period(key, freq=self.freq).ordinal diff --git a/vb_suite/timeseries.py b/vb_suite/timeseries.py index 2b63eeaf99550..bb55b88cf1f34 100644 --- a/vb_suite/timeseries.py +++ b/vb_suite/timeseries.py @@ -333,3 +333,28 @@ def date_range(start=None, end=None, periods=None, freq=None): timeseries_is_month_start = Benchmark('rng.is_month_start', setup, start_date=datetime(2014, 4, 1)) + +#---------------------------------------------------------------------- +# iterate over DatetimeIndex/PeriodIndex +setup = common_setup + """ +N = 1000000 +M = 10000 +idx1 = date_range(start='20140101', freq='T', periods=N) +idx2 = period_range(start='20140101', freq='T', periods=N) + +def iter_n(iterable, n=None): + i = 0 + for _ in iterable: + i += 1 + if n is not None and i > n: + break +""" + +timeseries_iter_datetimeindex = Benchmark('iter_n(idx1)', setup) + +timeseries_iter_periodindex = Benchmark('iter_n(idx2)', setup) + +timeseries_iter_datetimeindex_preexit = Benchmark('iter_n(idx1, M)', setup) + +timeseries_iter_periodindex_preexit = Benchmark('iter_n(idx2, M)', setup) +