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



我在尝试检查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

DataFrame比较是不正确的:

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

那么,在比较一个DataFrame时,我们真的不能不使用> < >= <=运算符,而需要依赖.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

这是一个将在下一个版本的 pandas (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

最新更新