我尝试在NaT面前获取包含datetime64数据的两个Pandas系列对象的min和max。np.最小值以及np.最大值如果数据类型是float64,就按我想要的方式工作。也就是说,一旦比较中的任何元素为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对象,则此操作不起作用:
^{pr2}$无论计算最小值还是最大值,我都希望索引0、2和3都显示为NaT(我知道numpy的函数可能不是最佳选择,但我没有成功地找到合适的Pandas类似物)
读了一点之后,我发现NaT只是近似的NaN,后者有一个适当的浮点表示。进一步的阅读表明,没有简单的方法让NaT“污染”这些比较。让NaT在最小/最大比较中传播的正确方法是什么?NaN在浮点上下文中的传播方式是什么?也许有熊猫等同于numpy.{maximum,minimum}哪些是NaT感知的?在
^{} 似乎是一个不放弃矢量化的解决方案:
正如您所发现的,您所看到的行为的原因是
^{pr2}$pd.NaT
有一个关联的int
值,该值用于比较操作:不确定这是最好的方法,但是如果您使用}仍然可以得到一系列的{},例如:
astype
将s1和s2的类型更改为object
,那么使用np.minimum
和{我想我已经弄清楚了。(好吧,至少我找到了一种方法来剥猫的皮。)虽然不是很漂亮,但比我最初的解决方案在apply()中嵌入所有逻辑要快得多。简单地说,解决方案包括将datetime元素转换为int,映射国家警察局到np.nan公司,正在应用np.最小值/np.maximum,然后转换回datetime64。apply()仍然涉及到,但是逻辑比我原来的逻辑大为减少。(毫无疑问,它还可以改进。我不是一个喜欢熊猫/裸体的人……)
编程相关推荐