我正在尝试使用此处建议的方法证明包含pd.Timestamp
个对象和np.nan
s的数组的正确性:Python: Justifying NumPy array(想法:用布尔数组掩盖NaN,对布尔数组进行排序(justified_mask
,然后将有效值分配给新的排序位置)。
引起问题的唯一一行是何时将Timestamp对象从旧的掩码数组插入到新的掩码数组中:
out[justified_mask] = arr[mask]
它引发以下错误:
TypeError:float()参数必须是字符串或数字,而不是 “时间戳记”
没有任何Traceback来自NumPy或更深的地方。有趣的是,等号两边的屏蔽操作都可以完美地进行。知道如何解决这个问题而不会遇到大麻烦吗? 我知道我可以通过从日期中减去时间戳对象并将其转换回整数来将其转换为整数,但这很容易,因为数组中还包含NaN。有没有更简单的解决方案?
编辑:可复制的示例
times = np.array([[np.nan, pd.Timestamp('2018-11-07')], [np.nan, pd.Timestamp('2018-11-07')]])
好的,很抱歉,我忘了提及我必须切换invalid_val来接受None
并让pd.isnull()
过滤掉NaN,使justify函数看起来像这样:
def justify(a, invalid_val=0, axis=1, side='left'):
if invalid_val is np.nan:
mask = ~np.isnan(arr)
elif (invalid_val is not np.nan) and (invalid_val is not None):
mask = arr != invalid_val
else:
mask = ~pd.isnull(arr)
justified_mask = np.sort(mask, axis=axis)
if (side == 'up') | (side == 'left'):
justified_mask = np.flip(justified_mask, axis=axis)
out = np.full(arr.shape, np.nan)
if axis == 1:
out[justified_mask] = arr[mask]
else:
out.T[justified_mask.T] = arr.T[mask.T]
如果您随后运行:
utils.justify(times, side='left', invalid_val=None)
您收到上述错误。