Python 从Timedelta和NaN数组中获取天数作为浮点值

Python 从Timedelta和NaN数组中获取天数作为浮点值,python,numpy,datetime,missing-data,Python,Numpy,Datetime,Missing Data,我有一个简单的问题,给我带来了很多麻烦:我有一个大的2D数组,它是datetime.Timedelta对象和np.nan的混合体,简化后如下: tdarray = np.array([dt.timedelta(days=5), np.nan]) 现在我想从timedelta对象中获取天数和浮点/整数,同时保持np.nan不变,即结果应该是np.array([5,nan]) 使用.days可以很容易地从timedelta对象中获取天数,并且应用数组的函数应该可以工作,例如使用np.fromit

我有一个简单的问题,给我带来了很多麻烦:我有一个大的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
,这也失败了。有什么简单的解决办法吗?

利用
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),那么


非常感谢你!没有人问过,但可能值得注意的是,后两种方法对我来说不适用于2D数组,但第一种方法确实适用!:-)@user3017048您最初的问题表明
tdarray
是1D。。。是的,2D数组的后两个中断是因为迭代
tdarray
会得到1D数组,我们不能对其应用
math.isnan
或执行
x.days
。您可以使用
tdarray.ravel()
在迭代之前展平数组,然后将
tdarray
重塑为其原始形状。@user3017048我已更新了2D案例的答案。奇怪的是,我认为
math.isnan也适用于泛型对象,但我错了,所以我删除了那个答案。
shape = tdarray.shape
tdarray = np.asarray([x.days if x == x else x 
                      for x in tdarray.ravel()],
                      dtype=np.float64).reshape(shape)