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 :(得分:39)
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
并且意识到它不是日期时间或时间点:
>>> isnat(np.timedelta64('NAT').view('i8'))
False
将来在numpy代码中可能会有isnat
- 函数,至少它们有一个(当前打开的)拉取请求:Link to the PR (NumPy github)
答案 1 :(得分:17)
自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)
答案 2 :(得分:14)
INTRO:这个答案写于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')
isnat
函数。
答案 3 :(得分:4)
非常简单,令人惊讶地快速 :( 没有numpy或pandas )
str( myDate ) == 'NaT' # True if myDate is NaT
好吧,这有点令人讨厌,但考虑到NaT&#39;周围的模糊性。它做得很好。
在比较两个日期时,它们也很有用,其中任何一个日期可能是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!)
答案 4 :(得分:1)
这种方法避免了警告,同时保留了面向数组的评估。
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')
答案 5 :(得分:-2)
另一种方法是捕捉这个例子:
def is_nat(npdatetime):
try:
npdatetime.strftime('%x')
return False
except:
return True