python-如何正确处理具有NaT值的整个DataFrame中的日期时间比较?

我在尝试检查DataFrame是否具有超过特定日期的值时偶然发现了这种奇怪的行为,而该DataFrame也可能包含pd.NaT

值比较的行为符合预期:

import pandas as pd

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

与系列的比较也表现出预期的效果

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,该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

解决方法:

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

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...