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