python - 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
解决方案
推荐阅读
- docker - 通过 Dockerfile 和 Kubernetes 部署通过 env 变量传递参数
- ios - Swift - 将 inout 参数传递给 scheduleTimer
- symfony - Symfony 5 表单通知:App\Entity\Epic 类的对象无法转换为 int
- c++ - 将回调从 C++ 发送到编译为 C++ 共享库的 MATLAB 函数
- ruby - 在 Grape API 服务器上获取 grape_logging 以输出到 docker 日志
- node.js - Mongoose Populate 返回空数组,加入并从其他表生成子表
- c# - 如何确保该对象仅在 sqare 内可见
- c# - C# Cefsharp - 在父浏览器中打开弹出窗口 - ILifeSpanHandler.OnBeforePopup
- javascript - 防止当前选项卡在 Angular 中加载 html 表单操作 URL
- ethereum - 即使交易通过,Metamask 也不会显示确认提示的原因可能是什么?