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
对象的底层编码非常接近,所以有时它们对同一日期的编码会重叠?