以为python的nan是专有的类型,但是JS、C++都有这个类型的,怪写的代码bug太少,没遇到
None 和 nan
type(None)-----------Nonetype
type(Nan)-------------float
判断nan
这里出了7个判断的方法,但实际有效的只有3个,还有半有效的~
后四个方法则是只有np.nan可以判断自己的类型,其他三种没办法自己判断自己。
也就是说:
np.nan is np.nan是True
float(‘nan’) is float(‘nan’) 是False,另外两个也是False
为什么呢?
Nan 全称是Not a Number,是IEEE754标准规定的双精度浮点小数类型的特殊值。所以看d的类型,即使np.nan,返回也是float类型。
import pandas as pd
import numpy as np
import math
from decimal import Decimal
'''由结果看,前两个是万能的'''
'''第三个对精度高的Decimal行不通'''
def isNan_1(a):
return math.isnan(a)
def isNan_2(a):
return a != a
def isNan_3(a):
if(str(a) == 'nan'):
return True
else:
return False
def isNan_4(a):
return a is float('nan')
def isNan_5(a):
return a is Decimal('nan')
def isNan_6(a):
return a is np.nan
def isNan_7(a):
return a is np.float64('nan')
尝试了四种类型,float(‘nan’) np.float64(‘nan’) Decimal(‘nan’) np.nan
从结果中发现,前两个函数是百分百正确的,而第三种则是对 float 和np.nan有效果,对精度较高的Decimal无效。而我也只能是凑巧找到了该方法。
a = float('nan')
type_str = "float('nan')"
print("%s type is \t \t \t \t %s\n"%(type_str, type(a)))
print("math.isnan(%s) \t \t %s\n"%(type_str, isNan_1(a)))
print("%s != %s \t \t %s\n"%(type_str, type_str, isNan_2(a)))
print("%s == 'nan' \t \t \t %s\n"%(type_str,isNan_3(a)))
print("%s is float('nan') \t \t %s\n"%(type_str,isNan_4(a)))
print("%s is Decimal('nan') \t \t %s\n"%(type_str,isNan_5(a)))
print("%s is np.nan \t \t \t %s\n"%(type_str,isNan_6(a)))
print("%s is np.float64('nan') \t %s\n"%(type_str,isNan_7(a)))
float('nan') type is <class 'float'>
math.isnan(float('nan')) True
float('nan') != float('nan') True
float('nan') == 'nan' True
float('nan') is float('nan') False
float('nan') is Decimal('nan') False
float('nan') is np.nan False
float('nan') is np.float64('nan') False
np.float64('nan') type is <class 'numpy.float64'>
math.isnan(np.float64('nan')) True
np.float64('nan') != np.float64('nan') True
np.float64('nan') == 'nan' True
np.float64('nan') is float('nan') False
np.float64('nan') is Decimal('nan') False
np.float64('nan') is np.nan False
np.float64('nan') is np.float64('nan') False
Decimal('nan') type is <class 'decimal.Decimal'>
math.isnan(Decimal('nan')) True
Decimal('nan') != Decimal('nan') True
Decimal('nan') == 'nan' False
Decimal('nan') is float('nan') False
Decimal('nan') is Decimal('nan') False
Decimal('nan') is np.nan False
Decimal('nan') is np.float64('nan') False
np.nan type is <class 'float'>
math.isnan(np.nan) True
np.nan != np.nan True
np.nan == 'nan' True
np.nan is float('nan') False
np.nan is Decimal('nan') False
np.nan is np.nan True
np.nan is np.float64('nan') False