对于 pandas,如何将 np.where 与可为空的日期时间列一起使用?

问题描述 投票:0回答:1

np.where
对于 pandas 来说非常有用,因为它是一种根据条件更改列的矢量化方式。

但是,虽然它似乎与

np
原生类型配合得很好,但它与日期配合得不太好。

这效果很好:

>>> df1 = pd.DataFrame([["a", 1], ["b", np.nan]], columns=["name", "num"])
>>> df1
  name  num
0    a  1.0
1    b  NaN
>>> np.where(df1["num"] < 2, df1["num"], np.nan)
array([ 1., nan])

但这不是:

>>> df2 = pd.DataFrame([["a", datetime.datetime(2024,1,2)], ["b", np.nan]], columns=["name", "date"])
>>> df2
  name       date
0    a 2024-01-02
1    b        NaT
>>> np.where(df["date"] < datetime.datetime(2024,3,1), df["date"], np.nan)
Traceback (most recent call last):
  File "<python-input-10>", line 1, in <module>
    np.where(df["date"] < datetime.datetime(2024,3,1), df["date"], np.nan)
    ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
numpy.exceptions.DTypePromotionError: The DType <class 'numpy.dtypes.DateTime64DType'> could not be promoted by <class 'numpy.dtypes._PyFloatDType'>. This means that no common DType exists for the given inputs. For example they cannot be stored in a single array unless the dtype is `object`. The full list of DTypes is: (<class 'numpy.dtypes.DateTime64DType'>, <class 'numpy.dtypes._PyFloatDType'>)
>>> 

执行后一个操作的正确矢量化方法是什么?

python pandas
1个回答
0
投票

numpy.where
返回具有单个数据类型的数组,您不应该使用
NaN
作为空值,而应使用
NaT
:

np.where(df2["date"] < datetime.datetime(2024,3,1), df2["date"], pd.NaT)
© www.soinside.com 2019 - 2024. All rights reserved.