From 989806d019bd671b5d5add7112f6b65ac5294166 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Tue, 3 Jul 2018 19:51:31 -0700 Subject: [PATCH 1/2] implement _local_timestamps --- pandas/core/arrays/datetimes.py | 16 +++++++++++++++- pandas/core/indexes/datetimes.py | 10 ++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index fb51f3324c5ea..b79692be3ab7c 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -2,9 +2,10 @@ import warnings import numpy as np +from pytz import utc from pandas._libs.tslib import Timestamp, NaT, iNaT -from pandas._libs.tslibs import timezones +from pandas._libs.tslibs import conversion, timezones from pandas.util._decorators import cache_readonly @@ -108,3 +109,16 @@ def _sub_datelike_dti(self, other): mask = (self._isnan) | (other._isnan) new_values[mask] = iNaT return new_values.view('timedelta64[ns]') + + # ----------------------------------------------------------------- + # Timezone Conversion and Localization Methods + + def _local_timestamps(self): + values = self.asi8 + indexer = values.argsort() + result = conversion.tz_convert(values.take(indexer), utc, self.tz) + + n = len(indexer) + reverse = np.empty(n, dtype=np.int_) + reverse.put(indexer, np.arange(n)) + return result.take(reverse) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 7475998909ec2..60809cc2b2afa 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -603,14 +603,8 @@ def _local_timestamps(self): if self.is_monotonic: return conversion.tz_convert(self.asi8, utc, self.tz) else: - values = self.asi8 - indexer = values.argsort() - result = conversion.tz_convert(values.take(indexer), utc, self.tz) - - n = len(indexer) - reverse = np.empty(n, dtype=np.int_) - reverse.put(indexer, np.arange(n)) - return result.take(reverse) + # fall back to non-optimized implementation + return DatetimeArrayMixin._local_timestamps(self) @classmethod def _simple_new(cls, values, name=None, freq=None, tz=None, From 8d20e09876b6350c7cfe610c28373acbc836e49b Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Wed, 4 Jul 2018 09:59:57 -0700 Subject: [PATCH 2/2] docstring, comment --- pandas/core/arrays/datetimes.py | 6 ++++++ pandas/core/indexes/datetimes.py | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index b79692be3ab7c..2569c3bc89889 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -114,6 +114,12 @@ def _sub_datelike_dti(self, other): # Timezone Conversion and Localization Methods def _local_timestamps(self): + """ + Convert to an i8 (unix-like nanosecond timestamp) representation + while keeping the local timezone and not using UTC. + This is used to calculate time-of-day information as if the timestamps + were timezone-naive. + """ values = self.asi8 indexer = values.argsort() result = conversion.tz_convert(values.take(indexer), utc, self.tz) diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 60809cc2b2afa..bf3b38916aa87 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -603,7 +603,6 @@ def _local_timestamps(self): if self.is_monotonic: return conversion.tz_convert(self.asi8, utc, self.tz) else: - # fall back to non-optimized implementation return DatetimeArrayMixin._local_timestamps(self) @classmethod