1. ホーム
  2. python

[解決済み] Numpy 値がNaTかどうかのチェック

2022-03-04 20:04:21

質問

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がそれを行うことができることを知っているが、私はむしろそのような基本的なもののために依存性を追加したくありません。

解決方法は?

はじめに この回答は、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比較の動作が変わっていなかったので、次のコードは矛盾していることが判明しました。

そして最後に、バージョン1.12.0から変更された動作に対応するために、numpyのバージョンを確認する必要があります。

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に含まれる isnat 関数は、バージョン 1.13 以降のものです。