我注意到在DataFrame上执行isin
,其中包含操作数为空DataFrame的日期时间类型,它会生成epoch datetime值(即1970-01-01),而不是'False'。这似乎不太可能是正确的吗?
以下代码演示了这一点:
(pandas = 0.19.2,numpy = 1.12.0)
import pandas as pd
data = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994', '2014-05-02 18:47:05.178768']}
data2 = {'date': ['2014-05-01 18:47:05.069722', '2014-05-01 18:47:05.119994']}
df = pd.DataFrame(data, columns = ['date'])
df['date'] = pd.to_datetime(df['date'])
df2 = pd.DataFrame(data2, columns = ['date'])
df2['date'] = pd.to_datetime(df2['date'])
df3 = pd.DataFrame([], columns = ['date'])
df4 = pd.DataFrame()
print df.isin(df2)
print df.isin(df3)
print df.isin(df4)
输出:
date
0 True
1 True
2 False
date
0 1970-01-01
1 1970-01-01
2 1970-01-01
date
0 1970-01-01
1 1970-01-01
2 1970-01-01
我通常会期待一个False值列表而不是'1970-01-01'?我注意到,当pandas = 0.16.2和numpy = 1.9.2时,df.isin(df3)
会产生更多预期:
date
0 False
1 False
2 False
但df.isin(df4)
与之前一样。
答案 0 :(得分:0)
这对我来说绝对是一个错误。 isin()
DataFrame.eq
调用了in the source code Pandas isin
with empty dataframe produces epoch value on datetime type instead of boolean #15473,奇怪的行为可以与DataFrame.eq
本身重现。
>>> df
date
0 2014-05-01 18:47:05.069722
1 2014-05-01 18:47:05.119994
2 2014-05-02 18:47:05.178768
>>> df.eq(pd.DataFrame(dict(date=[np.nan]*3)))
date
0 1970-01-01
1 1970-01-01
2 1970-01-01
我看到你现在把它提升为一个悬而未决的问题,
应该为即将发布的版本解决。