numpy:检查值是否为NaT

发布于 2021-01-29 15:07:25

nat = np.datetime64('NaT')
nat == nat
>> FutureWarning: In the future, 'NAT == x' and 'x == NAT' will always be False.

np.isnan(nat)
>> TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

如何检查datetime64是否为NaT?我似乎无法从文档中挖掘任何东西。我知道Pandas可以做到,但我不想对如此基本的东西添加依赖。

关注者
0
被浏览
99
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    简介:
    这个答案是在Numpy版本为1.11的时候写的,而NAT比较的行为应该从版本1.12开始改变。显然不是这种情况,答案的第二部分就错了。答案的第一部分可能不适用于新版本的numpy。确保已检查以下MSeifert的答案。


    第一次进行比较时,始终会发出警告。但是同时返回的比较结果是正确的:

    import numpy as np    
    nat = np.datetime64('NaT')
    
    def nat_check(nat):
        return nat == np.datetime64('NaT')
    
    nat_check(nat)
    Out[4]: FutureWarning: In the future, 'NAT == x' and 'x == NAT' will always be False.
    True
    
    nat_check(nat)
    Out[5]: True
    

    如果要禁止显示警告,则可以使用catch_warnings上下文管理器:

    import numpy as np
    import warnings
    
    nat = np.datetime64('NaT')
    
    def nat_check(nat):
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            return nat == np.datetime64('NaT')
    
    nat_check(nat)
    Out[5]: True
    

    编辑: 由于某些原因,Numpy版本1.12中NAT比较的行为没有改变,因此下一个代码证明是不一致的。

    最后,您可以检查numpy版本以处理自1.12.0版本以来的更改行为:

    def nat_check(nat):
        if [int(x) for x in np.__version__.split('.')[:-1]] > [1, 11]:
            return nat != nat
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            return nat == np.datetime64('NaT')
    

    编辑:
    正如MSeifert所述,Numpy包含isnat自版本1.13起的函数。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看