|
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