Python pandas`isin()`函数在pd.date_范围和datetime类型上的奇怪行为

Python pandas`isin()`函数在pd.date_范围和datetime类型上的奇怪行为,python,pandas,datetime,bug-reporting,isin,Python,Pandas,Datetime,Bug Reporting,Isin,我试图使用isin()在我的df中过滤datetime列。发现以下奇怪行为: >>>for i in range(1,10): >>> date_rg = pd.date_range(end='2011-11-04', periods=i) >>> print('i =', i) >>> print(df.date.dt.date.isin(date_rg)) i = 1 0 False Name:

我试图使用
isin()
在我的df中过滤datetime列。发现以下奇怪行为:

>>>for i in range(1,10):
>>>    date_rg = pd.date_range(end='2011-11-04', periods=i)
>>>    print('i =', i)
>>>    print(df.date.dt.date.isin(date_rg))

i = 1
0    False
Name: date, dtype: bool
i = 2
0    False
Name: date, dtype: bool
i = 3
0    True
Name: date, dtype: bool
i = 4
0    False
Name: date, dtype: bool
i = 5
0    True
Name: date, dtype: bool
i = 6
0    True
Name: date, dtype: bool
i = 7
0    True
Name: date, dtype: bool
i = 8
0    True
Name: date, dtype: bool
i = 9
0    True
Name: date, dtype: bool
让我们定义一个具有唯一日期值的数据帧:

>>>from datetime import datetime
>>>date = datetime.fromisoformat('2011-11-04')
>>>df = pd.DataFrame({'date': [date]})
>>>print(df)
        date
0 2011-11-04
我们将日期范围设置为2天:

>>>date_rg = pd.date_range(end='2011-11-04', periods=2)
日期应在以下范围内:

>>>date in date_rg
True
然而,如果我们使用
isin()
,奇怪的事情就会发生

经过进一步调查,我发现了更奇怪的行为:

>>>for i in range(1,10):
>>>    date_rg = pd.date_range(end='2011-11-04', periods=i)
>>>    print('i =', i)
>>>    print(df.date.dt.date.isin(date_rg))

i = 1
0    False
Name: date, dtype: bool
i = 2
0    False
Name: date, dtype: bool
i = 3
0    True
Name: date, dtype: bool
i = 4
0    False
Name: date, dtype: bool
i = 5
0    True
Name: date, dtype: bool
i = 6
0    True
Name: date, dtype: bool
i = 7
0    True
Name: date, dtype: bool
i = 8
0    True
Name: date, dtype: bool
i = 9
0    True
Name: date, dtype: bool
仅当周期=1、2和4天时,它返回False 我强烈怀疑这是熊猫图书馆的一个错误。 我正在使用
pandas:1.0.5
numpy:1.19.0

顺便说一下,我们可以使用
date\u range.date

>>>df.date.dt.date.isin(date_rg.date)
0    True
Name: date, dtype: bool
*相关:


.

根据副本,在
0.25
中曾经有一条错误消息,说明事情不一定会比较相等
datetime.date
np.timedelta64[ns]
是不同的对象。虽然他们应该代表同一件事,但没有理由平等。将
datetime64
datetime64
datetime.date
datetime.date
进行比较,所有比较工作正常。感谢@ALollz指出根本原因!尽管如此,这仍然是一个令人困惑的问题:例如,在我的上一个例子中,不同的句点,我希望是一致的False,因为它们是不同的类型,正如您所指出的。但为什么在某些情况下它们是“随机”真实的呢?只是我不知情的猜测:可能是因为
datetime.date
datetime.date
对象的底层编码非常接近,所以有时它们对同一日期的编码重叠?根据副本,过去在
0.25
中有一条错误消息,指出事物不一定会相等
datetime.date
np.timedelta64[ns]
是不同的对象。虽然他们应该代表同一件事,但没有理由平等。将
datetime64
datetime64
datetime.date
datetime.date
进行比较,所有比较工作正常。感谢@ALollz指出根本原因!尽管如此,这仍然是一个令人困惑的问题:例如,在我的上一个例子中,不同的句点,我希望是一致的False,因为它们是不同的类型,正如您所指出的。但为什么在某些情况下它们是“随机”真实的呢?只是我的猜测:可能是因为
datetime.date
datetime.date
对象的底层编码非常接近,所以有时它们对同一日期的编码会重叠?