【问题标题】:Get days as float from an array of Timedelta and NaN从 Timedelta 和 NaN 数组中获取浮点数
【发布时间】:2018-09-20 07:10:15
【问题描述】:

我有一个给我带来很多麻烦的简单问题:我有一个大的二维数组,它是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 而失败。有没有简单的解决办法?

【问题讨论】:

    标签: python numpy datetime missing-data


    【解决方案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)
    

    【讨论】:

    • 非常感谢!没有被问到,但也许值得注意的是,后两种方法对我来说不适用于 2D 数组,但第一种方法可以!:-)
    • @user3017048 您最初的问题表明tdarray 是一维...是的,后两个为二维数组中断,因为迭代tdarray 给出一维数组,我们不能应用math.isnan 或做x.days 在他们身上。您可以做的是使用tdarray.ravel() 来展平数组,然后再对其进行迭代,然后将tdarray 重塑为其原始形状。
    • @user3017048 我已经更新了 2D 案例的答案。奇怪,我以为math.isnan 也适用于通用对象,但我错了,所以我删除了那个答案。
    猜你喜欢
    • 2012-03-09
    • 2013-05-05
    • 2014-02-20
    • 1970-01-01
    • 2015-01-11
    • 2012-08-29
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多