python - 从 Timedelta 和 NaN 数组中获取浮点数
问题描述
我有一个给我带来很多麻烦的简单问题:我有一个大的 2D 数组,它是datetime.Timedelta
对象 和的混合体np.nan
,简化后看起来像这样:
tdarray = np.array([dt.timedelta(days=5), np.nan])
现在我想从 timedelta 对象中获取天数和浮点数/整数,同时保持np.nan
原样,即结果应该是np.array([ 5., nan])
.
从 timedelta 对象中获取日期很容易.days
,并应用数组应该使用的函数,例如,np.fromiter
然后重新整形。但是,我如何捕捉尝试从 NaN 获取日期时发生的错误?我尝试了屏蔽,但这也失败了 AttributeErrorMaskedArray
没有属性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) 那么
shape = tdarray.shape
tdarray = np.asarray([x.days if x == x else x
for x in tdarray.ravel()],
dtype=np.float64).reshape(shape)
推荐阅读
- reactjs - TypeError:无法读取未定义错误的属性“地图”
- laravel - 将我的信息保存在数据库中的 Laravel CRUD 问题
- sql - Sql 内存问题
- scala - 使用 spark 处理大量数据 (5TB)
- python - 在python中使用递归的星号倒金字塔
- concourse - 无法从 GUI 登录大厅
- amazon-web-services - 将输出变量从一个模块传递到另一个模块时出现 Terraform 错误
- mysql - 在单个查询中添加多个 where 子句
- python - 如何使用python在azure中获取虚拟机的资源ID
- python - 如何将 json 有效负载与图像一起发送到 FastAPI 实例?