|
36 | 36 | join as libjoin, Timedelta, NaT, iNaT)
|
37 | 37 |
|
38 | 38 |
|
| 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 | + |
39 | 59 | def _td_index_cmp(opname, nat_result=False):
|
40 | 60 | """
|
41 | 61 | Wrap comparison operations to convert timedelta-like to timedelta64
|
@@ -381,46 +401,17 @@ def _format_native_types(self, na_rep=u('NaT'),
|
381 | 401 | nat_rep=na_rep,
|
382 | 402 | justify='all').get_result()
|
383 | 403 |
|
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") |
424 | 415 |
|
425 | 416 | @property
|
426 | 417 | def components(self):
|
|
0 commit comments