猿问

让 Pandas NaT 像 NaN 一样传播

我试图在 NaT 面前获取包含 datetime64 数据的几个 Pandas Series 对象的最小值和最大值。如果 dtype 是 float64, np.minimum 和 np.maximum 会按照我想要的方式工作。也就是说,一旦比较中的任何元素为 NaN,NaN 将是该比较的结果。例如:


>>> s1

0    0.0

1    1.8

2    3.6

3    5.4

dtype: float64

>>> s2

0    10.0

1    17.0

2     NaN

3    14.0

dtype: float64

>>> np.maximum(s1, s2)

0    10.0

1    17.0

2     NaN

3    14.0

dtype: float64

>>> np.minimum(s1, s2)

0    0.0

1    1.8

2    NaN

3    5.4

dtype: float64

如果 s1 和 s2 是 datetime64 对象,则这不起作用:


>>> s1

0   2199-12-31

1   2199-12-31

2   2199-12-31

3   2199-12-31

dtype: datetime64[ns]

>>> s2

0          NaT

1   2018-10-30 

2          NaT

3          NaT

dtype: datetime64[ns]

>>> np.maximum(s1, s2)

0   2199-12-31

1   2199-12-31

2   2199-12-31

3   2199-12-31

dtype: datetime64[ns]

>>> np.minimum(s1, s2)

0   2199-12-31

1   2018-10-30

2   2199-12-31

3   2199-12-31

dtype: datetime64[ns]

无论是计算最小值还是最大值,我都希望索引 0、2 和 3 显示为 NaT。(我意识到 numpy 的函数可能不是最佳选择,但我没有成功找到合适的 Pandas 类似物。)


在做了一些阅读之后,我开始意识到 NaT 只是近似 NaN,后者具有适当的浮点表示。进一步阅读表明没有简单的方法可以让 NaT“污染”这些比较。让 NaT 在最小/最大比较中传播的正确方法是什么,就像 NaN 在浮点上下文中所做的那样?也许有与 numpy.{maximum,minimum} 等价的 Pandas 是 NaT 感知的?


开满天机
浏览 250回答 3
3回答

慕姐4208626

不确定这是最好的方法,但是如果您将 s1 和 s2 的类型更改为objectwith astype,然后使用np.minimumandnp.maximum工作,您仍然会得到一系列datetime64[ns],例如:print (np.maximum(s1.astype(object), s2.astype(object)))0          NaT1   2199-12-312          NaT3          NaTName: 1, dtype: datetime64[ns]
随时随地看视频慕课网APP

相关分类

Python
我要回答