如何使用NaT值正确处理整个DataFrame中的日期时间比较?

时间:2019-01-04 21:10:57

标签: python pandas datetime dataframe

当尝试检查DataFrame是否具有某个特定日期以上的值时,我偶然发现了这种奇怪的行为,而该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

1 个答案:

答案 0 :(得分:3)

这是一个错误,将在下一版熊猫(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