从Timedelta和NaN数组中获取浮动天数

时间:2018-09-20 07:10:16

标签: 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.fromiter,然后重塑。但是,当尝试从NaN获取日期时,如何捕获发生的错误?我尝试了屏蔽,但是由于MaskedArray没有属性days的AttributeError,这也失败了。有什么简单的解决方法吗?

1 个答案:

答案 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)