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