how to test if a variable is pd.NaT?

前端 未结 4 941
我寻月下人不归
我寻月下人不归 2020-12-14 14:01

I\'m trying to test if one of my variables is pd.NaT. I know it is NaT, and still it won\'t pass the test. As an example, the following code prints nothing :



        
相关标签:
4条回答
  • 2020-12-14 14:35

    Pandas NaT behaves like a floating-point NaN, in that it's not equal to itself. Instead, you can use pandas.isnull:

    In [21]: pandas.isnull(pandas.NaT)
    Out[21]: True
    

    This also returns True for None and NaN.

    Technically, you could also check for Pandas NaT with x != x, following a common pattern used for floating-point NaN. However, this is likely to cause issues with NumPy NaTs, which look very similar and represent the same concept, but are actually a different type with different behavior:

    In [29]: x = pandas.NaT
    
    In [30]: y = numpy.datetime64('NaT')
    
    In [31]: x != x
    Out[31]: True
    
    In [32]: y != y
    /home/i850228/.local/lib/python3.6/site-packages/IPython/__main__.py:1: FutureWarning: In the future, NAT != NAT will be True rather than False.
      # encoding: utf-8
    Out[32]: False
    

    numpy.isnat, the function to check for NumPy NaT, also fails with a Pandas NaT:

    In [33]: numpy.isnat(pandas.NaT)
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-33-39a66bbf6513> in <module>()
    ----> 1 numpy.isnat(pandas.NaT)
    
    TypeError: ufunc 'isnat' is only defined for datetime and timedelta.
    

    pandas.isnull works for both Pandas and NumPy NaTs, so it's probably the way to go:

    In [34]: pandas.isnull(pandas.NaT)
    Out[34]: True
    
    In [35]: pandas.isnull(numpy.datetime64('NaT'))
    Out[35]: True
    
    0 讨论(0)
  • 2020-12-14 14:35
    pd.NaT is pd.NaT
    

    True

    this works for me.

    0 讨论(0)
  • 2020-12-14 14:38

    You can also use pandas.isna() for pandas.NaT, numpy.nan or None:

    import pandas as pd
    import numpy as np
    
    x = (pd.NaT, np.nan, None)
    [pd.isna(i) for i in x]
    
    Output:
    [True, True, True]
    
    0 讨论(0)
  • 2020-12-14 14:40

    If it's in a Series (e.g. DataFrame column) you can also use .isna():

    pd.Series(pd.NaT).isna()
    # 0    True
    # dtype: bool
    
    0 讨论(0)
提交回复
热议问题