代码之家  ›  专栏  ›  技术社区  ›  ALollz

如何正确处理具有nat值的整个数据帧中的日期时间比较?

  •  3
  • ALollz  · 技术社区  · 6 年前

    当我试图检查 DataFrame 值大于某个日期,而该数据帧也可能包含 pd.NaT

    值的比较按预期进行:

    import pandas as pd
    
    pd.NaT > pd.to_datetime('2018-10-15')
    # False
    

    Series 也应按预期行事:

    s = pd.Series([pd.NaT, pd.to_datetime('2018-10-16')])
    s > pd.to_datetime('2018-10-15')
    
    #0    False
    #1     True
    #dtype: bool
    

    但是 数据文件 比较不正确:

    s.to_frame() > pd.to_datetime('2018-10-15')
    #      0
    #0  True
    #1  True
    

    在我看来,问题是比较最初返回 NaN 哪一个是(在某个时刻?)被迫的 True 鉴于以下行为:

    df = pd.DataFrame([[pd.NaT, pd.to_datetime('2018-10-16')],
                       [pd.to_datetime('2018-10-16'), pd.NaT]])
    
    df >= pd.to_datetime('2018-10-15')
    #      0     1
    #0  True  True
    #1  True  True
    
    df.ge(pd.to_datetime('2018-10-15'))
    #     0    1
    #0  NaN  1.0
    #1  1.0  NaN
    

    所以我们真的不能用 > < >= <= 比较时的运算符 数据文件 需要依靠 .lt .gt .le .ge 其次是 .fillna(0) ?

    df.ge(pd.to_datetime('2018-10-15')).fillna(0)
    #     0    1
    #0  0.0  1.0
    #1  1.0  0.0
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   root    6 年前

    这是一个将在下一个熊猫版本(0.24.0)中修复的错误:

    In [1]: import pandas as pd; pd.__version__
    Out[1]: '0.24.0.dev0+1504.g9642fea9c'
    
    In [2]: s = pd.Series([pd.NaT, pd.to_datetime('2018-10-16')])
    
    In [3]: s > pd.to_datetime('2018-10-15')
    Out[3]:
    0    False
    1     True
    dtype: bool
    
    In [4]: s.to_frame() > pd.to_datetime('2018-10-15')
    Out[4]:
           0
    0  False
    1   True
    
    In [5]: df = pd.DataFrame([[pd.NaT, pd.to_datetime('2018-10-16')],
       ...:                    [pd.to_datetime('2018-10-16'), pd.NaT]])
       ...:
    
    In [6]: df >= pd.to_datetime('2018-10-15')
    Out[6]:
           0      1
    0  False   True
    1   True  False
    
    In [7]: df.ge(pd.to_datetime('2018-10-15'))
    Out[7]:
           0      1
    0  False   True
    1   True  False
    

    有关相应的Github问题,请参见: https://github.com/pandas-dev/pandas/issues/22242