|
19 | 19 | from functools import reduce
|
20 | 20 | from . import numerictypes as _nt
|
21 | 21 | from .umath import maximum, minimum, absolute, not_equal, isnan, isinf
|
22 |
| -from .multiarray import format_longfloat, datetime_as_string, datetime_data |
| 22 | +from .multiarray import (array, format_longfloat, datetime_as_string, |
| 23 | + datetime_data) |
23 | 24 | from .fromnumeric import ravel
|
24 | 25 | from .numeric import asarray
|
25 | 26 |
|
@@ -733,10 +734,22 @@ def __call__(self, x):
|
733 | 734 | class TimedeltaFormat(object):
|
734 | 735 | def __init__(self, data):
|
735 | 736 | if data.dtype.kind == 'm':
|
736 |
| - v = data.view('i8') |
737 |
| - max_str_len = max(len(str(maximum.reduce(v))), |
738 |
| - len(str(minimum.reduce(v)))) |
| 737 | + nat_value = array(['NaT'], dtype=data.dtype)[0] |
| 738 | + v = data[not_equal(data, nat_value)].view('i8') |
| 739 | + if len(v) > 0: |
| 740 | + # Max str length of non-NaT elements |
| 741 | + max_str_len = max(len(str(maximum.reduce(v))), |
| 742 | + len(str(minimum.reduce(v)))) |
| 743 | + else: |
| 744 | + max_str_len = 0 |
| 745 | + if len(v) < len(data): |
| 746 | + # data contains a NaT |
| 747 | + max_str_len = max(max_str_len, 5) |
739 | 748 | self.format = '%' + str(max_str_len) + 'd'
|
| 749 | + self._nat = "'NaT'".rjust(max_str_len) |
740 | 750 |
|
741 | 751 | def __call__(self, x):
|
742 |
| - return self.format % x.astype('i8') |
| 752 | + if x + 1 == x: |
| 753 | + return self._nat |
| 754 | + else: |
| 755 | + return self.format % x.astype('i8') |
0 commit comments