Skip to content

Commit 079f678

Browse files
jbrockmendeljreback
authored andcommitted
Modernize indexes.timedeltas, indexes.datetimeindex (pandas-dev#18161)
1 parent 93c755e commit 079f678

File tree

2 files changed

+35
-51
lines changed

2 files changed

+35
-51
lines changed

pandas/core/indexes/datetimes.py

+4-11
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
from __future__ import division
33
import operator
44
import warnings
5-
from datetime import time, datetime
6-
from datetime import timedelta
5+
from datetime import time, datetime, timedelta
6+
77
import numpy as np
8+
from pytz import utc
9+
810
from pandas.core.base import _shared_docs
911

1012
from pandas.core.dtypes.common import (
@@ -56,18 +58,13 @@
5658
from pandas._libs.tslibs import timezones
5759

5860

59-
def _utc():
60-
import pytz
61-
return pytz.utc
62-
6361
# -------- some conversion wrapper functions
6462

6563

6664
def _field_accessor(name, field, docstring=None):
6765
def f(self):
6866
values = self.asi8
6967
if self.tz is not None:
70-
utc = _utc()
7168
if self.tz is not utc:
7269
values = self._local_timestamps()
7370

@@ -563,8 +560,6 @@ def _convert_for_op(self, value):
563560
raise ValueError('Passed item and index have different timezone')
564561

565562
def _local_timestamps(self):
566-
utc = _utc()
567-
568563
if self.is_monotonic:
569564
return libts.tz_convert(self.asi8, utc, self.tz)
570565
else:
@@ -825,7 +820,6 @@ def _add_delta(self, delta):
825820

826821
tz = 'UTC' if self.tz is not None else None
827822
result = DatetimeIndex(new_values, tz=tz, name=name, freq='infer')
828-
utc = _utc()
829823
if self.tz is not None and self.tz is not utc:
830824
result = result.tz_convert(self.tz)
831825
return result
@@ -879,7 +873,6 @@ def astype(self, dtype, copy=True):
879873
raise ValueError('Cannot cast DatetimeIndex to dtype %s' % dtype)
880874

881875
def _get_time_micros(self):
882-
utc = _utc()
883876
values = self.asi8
884877
if self.tz is not None and self.tz is not utc:
885878
values = self._local_timestamps()

pandas/core/indexes/timedeltas.py

+31-40
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,26 @@
3636
join as libjoin, Timedelta, NaT, iNaT)
3737

3838

39+
def _field_accessor(name, alias, docstring=None):
40+
def f(self):
41+
if self.hasnans:
42+
result = np.empty(len(self), dtype='float64')
43+
mask = self._isnan
44+
imask = ~mask
45+
result.flat[imask] = np.array([getattr(Timedelta(val), alias)
46+
for val in self.asi8[imask]])
47+
result[mask] = np.nan
48+
else:
49+
result = np.array([getattr(Timedelta(val), alias)
50+
for val in self.asi8], dtype='int64')
51+
52+
return Index(result, name=self.name)
53+
54+
f.__name__ = name
55+
f.__doc__ = docstring
56+
return property(f)
57+
58+
3959
def _td_index_cmp(opname, nat_result=False):
4060
"""
4161
Wrap comparison operations to convert timedelta-like to timedelta64
@@ -381,46 +401,17 @@ def _format_native_types(self, na_rep=u('NaT'),
381401
nat_rep=na_rep,
382402
justify='all').get_result()
383403

384-
def _get_field(self, m):
385-
386-
values = self.asi8
387-
hasnans = self.hasnans
388-
if hasnans:
389-
result = np.empty(len(self), dtype='float64')
390-
mask = self._isnan
391-
imask = ~mask
392-
result.flat[imask] = np.array(
393-
[getattr(Timedelta(val), m) for val in values[imask]])
394-
result[mask] = np.nan
395-
else:
396-
result = np.array([getattr(Timedelta(val), m)
397-
for val in values], dtype='int64')
398-
return Index(result, name=self.name)
399-
400-
@property
401-
def days(self):
402-
""" Number of days for each element. """
403-
return self._get_field('days')
404-
405-
@property
406-
def seconds(self):
407-
""" Number of seconds (>= 0 and less than 1 day) for each element. """
408-
return self._get_field('seconds')
409-
410-
@property
411-
def microseconds(self):
412-
"""
413-
Number of microseconds (>= 0 and less than 1 second) for each
414-
element. """
415-
return self._get_field('microseconds')
416-
417-
@property
418-
def nanoseconds(self):
419-
"""
420-
Number of nanoseconds (>= 0 and less than 1 microsecond) for each
421-
element.
422-
"""
423-
return self._get_field('nanoseconds')
404+
days = _field_accessor("days", "days",
405+
" Number of days for each element. ")
406+
seconds = _field_accessor("seconds", "seconds",
407+
" Number of seconds (>= 0 and less than 1 day) "
408+
"for each element. ")
409+
microseconds = _field_accessor("microseconds", "microseconds",
410+
"\nNumber of microseconds (>= 0 and less "
411+
"than 1 second) for each\nelement. ")
412+
nanoseconds = _field_accessor("nanoseconds", "nanoseconds",
413+
"\nNumber of nanoseconds (>= 0 and less "
414+
"than 1 microsecond) for each\nelement.\n")
424415

425416
@property
426417
def components(self):

0 commit comments

Comments
 (0)