Numpy:检查值是否为NaT

j2datikz  于 2022-11-23  发布在  其他
关注(0)|答案(6)|浏览(127)
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可以做到这一点,但我宁愿不为如此基本的东西添加依赖项。

bd1hkmkf

bd1hkmkf1#

pandas可以使用pandas.isnull检查NaT

>>> import numpy as np
>>> import pandas as pd
>>> pd.isnull(np.datetime64('NaT'))
True

如果你不想使用Pandas,你也可以定义你自己的函数(部分取自Pandas源):

nat_as_integer = np.datetime64('NAT').view('i8')

def isnat(your_datetime):
    dtype_string = str(your_datetime.dtype)
    if 'datetime64' in dtype_string or 'timedelta64' in dtype_string:
        return your_datetime.view('i8') == nat_as_integer
    return False  # it can't be a NaT if it's not a dateime

这可正确识别NaT值:

>>> isnat(np.datetime64('NAT'))
True

>>> isnat(np.timedelta64('NAT'))
True

如果不是datetime或timedelta,则会意识到:

>>> isnat(np.timedelta64('NAT').view('i8'))
False

将来numpy代码中可能会有一个isnat-函数,至少他们有一个(当前打开的)关于它的pull请求:Link to the PR (NumPy github)

xjreopfe

xjreopfe2#

从NumPy版本1.13开始,它包含一个isnat函数:

>>> import numpy as np
>>> np.isnat(np.datetime64('nat'))
True

它也适用于数组:

>>> np.isnat(np.array(['nat', 1, 2, 3, 4, 'nat', 5], dtype='datetime64[D]'))
array([ True, False, False, False, False,  True, False], dtype=bool)
ttp71kqs

ttp71kqs3#

**简介:**这个答案是在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

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

最后,您可以检查numpy version来处理自版本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')

**EDIT:**如MSeifert所述,Numpy从版本1.13开始就包含isnat函数。

qvk1mo1f

qvk1mo1f4#

非常简单,而且快得惊人**:(没有麻木或Pandas

str( myDate ) == 'NaT'            # True if myDate is NaT

好吧,这是一个有点讨厌,但考虑到周围的模糊'NaT'它做的工作很好。
在比较两个日期(其中一个可能是NaT)时,它也很有用,如下所示:

str( date1 ) == str( date1 )       # True
   str( date1 ) == str( NaT )         # False
   str( NaT )   == str( date1 )       # False

wait for it...

   str( NaT )   == str( NaT )         # True    (hooray!)
guicsvcw

guicsvcw5#

这种方法避免了警告,同时保留了面向数组的计算。

import numpy as np
def isnat(x):
    """ 
    datetime64 analog to isnan.
    doesn't yet exist in numpy - other ways give warnings
    and are likely to change.  
    """
    return x.astype('i8') == np.datetime64('NaT').astype('i8')
rqcrx0a6

rqcrx0a66#

另一种方法是捕捉例外:

def is_nat(npdatetime):
    try:
        npdatetime.strftime('%x')
        return False
    except:
        return True

相关问题