首页 > 解决方案 > pandas `isin()` 函数对 pd.date_range 和 datetime 类型的奇怪行为

问题描述

我试图用来isin()过滤我的df中的日期时间列。发现以下奇怪行为:

让我们定义一个具有唯一日期值的数据框:

>>>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(),就会发生奇怪的事情!

>>>df.date.dt.date.isin(date_rg)
0    False
Name: date, dtype: bool

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

>>>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

只有当 period = 1、2 和 4 天时,它才会返回 False! 我强烈怀疑这是 Pandas lib 的错误。我正在pandas:1.0.5使用numpy:1.19.0.

顺便说一句,我们可以使用以下方法对其进行轮廓化date_range.date

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

*相关:
isin-function-does-not-work-for-dates。
问题 5021

标签: pythonpandasdatetimebug-reportingisin

解决方案


推荐阅读