我有一个简单的问题,给我带来很多麻烦:我有一个很大的2D数组,它是datetime.Timedelta
对象和np.nan
的混合体,简化后看起来像这样:
tdarray = np.array([dt.timedelta(days=5), np.nan])
现在,我想从timedelta对象获取日期和浮点数/整数,而将np.nan
保持原样,即结果应为np.array([ 5., nan])
。
使用.days
可以很容易地从timedelta对象获取日期,并且应用该函数应该可以工作,例如np.fromiter
,然后重塑。但是,当尝试从NaN获取日期时,如何捕获发生的错误?我尝试了屏蔽,但是由于MaskedArray
没有属性days
的AttributeError,这也失败了。有什么简单的解决方法吗?
答案 0 :(得分:1)
利用np.nan
是唯一不等于自身的对象这一事实。请注意,如果您的数组包含其他对象,则应为它们定义相等运算符,否则将引发错误。
tdarray = np.asarray([dt.timedelta(days=5), np.nan])
mask = tdarray == tdarray # This gives array([True, False])
tdarray[mask] = [x.days for x in tdarray[mask]]
# Optionally cast to float
tdarray = tdarray.astype(np.float64)
或者您可以简单地重建数组
tdarray = np.asarray([x.days if x == x else x for x in tdarray],
dtype=np.float64)
如果tdarray
是一个ND数组(N> 1),则
shape = tdarray.shape
tdarray = np.asarray([x.days if x == x else x
for x in tdarray.ravel()],
dtype=np.float64).reshape(shape)