从 Timedelta 和 NaN 数组中获取浮动天数
Get days as float from an array of Timedelta and NaN
我有一个简单的问题给我带来了很多麻烦:我有一个很大的二维数组,它是 datetime.Timedelta
对象和 np.nan
的混合体,简化后的样子是这样的:
tdarray = np.array([dt.timedelta(days=5), np.nan])
现在我想从 timedelta 对象中获取日期和 float/integer,同时保持 np.nan
不变,即结果应该是 np.array([ 5., nan])
.
使用 .days
从 timedelta 对象中获取日期很容易,并应用数组应该工作的函数,例如用 np.fromiter
然后重塑。但是,如何捕获尝试从 NaN 获取日期时发生的错误?我尝试了屏蔽,但这也因 MaskedArray
没有属性 days
的 AttributeError 而失败。有什么简单的解决办法吗?
利用 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)
我有一个简单的问题给我带来了很多麻烦:我有一个很大的二维数组,它是 datetime.Timedelta
对象和 np.nan
的混合体,简化后的样子是这样的:
tdarray = np.array([dt.timedelta(days=5), np.nan])
现在我想从 timedelta 对象中获取日期和 float/integer,同时保持 np.nan
不变,即结果应该是 np.array([ 5., nan])
.
使用 .days
从 timedelta 对象中获取日期很容易,并应用数组应该工作的函数,例如用 np.fromiter
然后重塑。但是,如何捕获尝试从 NaN 获取日期时发生的错误?我尝试了屏蔽,但这也因 MaskedArray
没有属性 days
的 AttributeError 而失败。有什么简单的解决办法吗?
利用 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)