微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐