Skip to content

Commit ae92cf8

Browse files
committed
BUG: workaround datetime.datetime TypeError #742
1 parent a4e90e0 commit ae92cf8

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

pandas/src/stats.pyx

+30-6
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ def rank_1d_generic(object in_arr):
101101
ndarray sorted_data, values
102102
ndarray[int64_t] argsorted
103103
int32_t idx
104-
float64_t val, nan_value
104+
object val, nan_value
105105
float64_t sum_ranks = 0
106106

107-
values = np.asarray(in_arr).copy()
107+
values = np.array(in_arr, copy=True)
108108

109109
if values.dtype != np.object_:
110110
values = values.astype('O')
@@ -117,7 +117,14 @@ def rank_1d_generic(object in_arr):
117117
ranks = np.empty(n, dtype='f8')
118118

119119
# py2.5/win32 hack, can't pass i8
120-
_as = values.argsort()
120+
try:
121+
_as = values.argsort()
122+
except TypeError:
123+
valid_locs = (-mask).nonzero()[0]
124+
ranks.put(valid_locs, rank_1d_generic(values.take(valid_locs)))
125+
np.putmask(ranks, mask, np.nan)
126+
return ranks
127+
121128
sorted_data = values.take(_as)
122129
argsorted = _as.astype('i8')
123130

@@ -129,12 +136,18 @@ def rank_1d_generic(object in_arr):
129136
ranks[argsorted[i]] = nan
130137
continue
131138
if (i == n - 1 or
132-
fabs(util.get_value_at(sorted_data, i + 1) - val) > FP_ERR):
139+
are_diff(util.get_value_at(sorted_data, i + 1), val)):
133140
for j in range(i - dups + 1, i + 1):
134141
ranks[argsorted[j]] = sum_ranks / dups
135142
sum_ranks = dups = 0
136143
return ranks
137144

145+
cdef inline are_diff(object left, object right):
146+
try:
147+
return fabs(left - right) > FP_ERR
148+
except TypeError:
149+
return left != right
150+
138151
class Infinity(object):
139152

140153
return_false = lambda self, other: False
@@ -177,7 +190,18 @@ def rank_2d_generic(object in_arr, axis=0):
177190

178191
n, k = (<object> values).shape
179192
ranks = np.empty((n, k), dtype='f8')
180-
argsorted = values.argsort(1).astype('i8')
193+
194+
try:
195+
argsorted = values.argsort(1).astype('i8')
196+
except TypeError:
197+
values = in_arr
198+
for i in range(len(values)):
199+
ranks[i] = rank_1d_generic(in_arr[i])
200+
if axis == 0:
201+
return ranks.T
202+
else:
203+
return ranks
204+
181205
values.sort(axis=1)
182206

183207
for i in range(n):
@@ -190,7 +214,7 @@ def rank_2d_generic(object in_arr, axis=0):
190214
continue
191215
sum_ranks += (j - infs) + 1
192216
dups += 1
193-
if j == k - 1 or values[i, j + 1] != val:
217+
if j == k - 1 or are_diff(values[i, j + 1], val):
194218
for z in range(j - dups + 1, j + 1):
195219
ranks[i, argsorted[i, z]] = sum_ranks / dups
196220
sum_ranks = dups = 0

pandas/tests/test_frame.py

+1
Original file line numberDiff line numberDiff line change
@@ -4186,6 +4186,7 @@ def test_rank2(self):
41864186
result = df.rank(0, numeric_only=False)
41874187
assert_frame_equal(result, expected)
41884188

4189+
# f7u12, this does not work without extensive workaround
41894190
data = [[datetime(2001, 1, 5), nan, datetime(2001, 1, 2)],
41904191
[datetime(2000, 1, 2), datetime(2000, 1, 3),
41914192
datetime(2000, 1, 1)]]

0 commit comments

Comments
 (0)