isin不适用于日期时间的ndarray,除非有弃用警告



我有以下两个日期时间数组:

日期A:

datesA
array([datetime.datetime(2000, 1, 4, 0, 0),
datetime.datetime(2000, 1, 5, 0, 0),
datetime.datetime(2000, 1, 6, 0, 0),
datetime.datetime(2000, 1, 7, 0, 0),
datetime.datetime(2000, 1, 8, 0, 0),
datetime.datetime(2000, 1, 9, 0, 0),
datetime.datetime(2000, 1, 10, 0, 0),
datetime.datetime(2000, 1, 11, 0, 0),
datetime.datetime(2000, 1, 12, 0, 0)], dtype=object)

和日期B:

datesB
array([datetime.datetime(2000, 1, 4, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 5, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 6, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 7, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 10, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 11, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 12, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 13, 0, 0, tzinfo=<UTC>),
datetime.datetime(2000, 1, 14, 0, 0, tzinfo=<UTC>)], dtype=object)

我想在日期A中查找不在日期B中的日期。像下面这样使用~isin()会为所有行返回True,而不仅仅是不在日期中的行B:

datesA_not_in_datesB = ~np.isin(datesA,datesB)
datesA_not_in_datesB.reshape(-1,1)
array([[ True],
[ True],
[ True],
[ True],
[ True],
[ True],
[ True],
[ True],
[ True]])

日期第4行和第5行(datetime.datetime(2000,1,8,0,0(datetime.datatime(2000、1,9,0,O(rue的记录

我发现isin()不适用于这些帖子中报告的日期时间:

  • ISIN函数不适用于日期
  • https://github.com/pandas-dev/pandas/issues/5021

有人在上面的帖子中建议的修复方法是:

datesA_not_in_datesB = ~np.isin(datesA.astype('datetime64[ns]'),datesB.astype('datetime64[ns]'))
​
C:UsersUsernameanaconda3libsite-packagesipykernel_launcher.py:1: DeprecationWarning: parsing timezone aware datetimes is deprecated; this will raise an error in the future
"""Entry point for launching an IPython kernel.
datesA_not_in_datesB.reshape(-1,1)
array([[False],
[False],
[False],
[False],
[ True],
[ True],
[False],
[False],
[False]])

这是有效的,除非我收到警告信息:

不推荐使用警告:不推荐使用解析时区感知日期时间;这将在将来引发一个错误"启动的入口点IPython内核。

我已经尝试了一些方法来从日期中删除时区.replace(tzinfo=None)信息B,如果不使用.astype('datetime64[ns]'),这是一项工作,并且找到了一个没有DeprecationWarning的解决方案,但都无济于事。

有人能就如何获得与相同的结果提出建议吗

datesA_not_in_datesB = ~np.isin(datesA.astype('datetime64[ns]'),datesB.astype('datetime64[ns]'))

但不会导致折旧警告

非常感谢您的时间和帮助。

我从日期时间对象中删除了tzinfo=<UTC>

此代码没有给我任何警告。。

如果我没有抓住要点,我深表歉意!

import numpy as np
import datetime
from pytz import UTC
datesA = np.array([datetime.datetime(2000, 1, 4, 0, 0),
datetime.datetime(2000, 1, 5, 0, 0),
datetime.datetime(2000, 1, 6, 0, 0),
datetime.datetime(2000, 1, 7, 0, 0),
datetime.datetime(2000, 1, 8, 0, 0),
datetime.datetime(2000, 1, 9, 0, 0),
datetime.datetime(2000, 1, 10, 0, 0),
datetime.datetime(2000, 1, 11, 0, 0),
datetime.datetime(2000, 1, 12, 0, 0)], dtype=object)
datesB = np.array([datetime.datetime(2000, 1, 4, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 5, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 6, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 7, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 10, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 11, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 12, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 13, 0, 0, tzinfo=UTC),
datetime.datetime(2000, 1, 14, 0, 0, tzinfo=UTC)], dtype=object)
datesB = np.array([d.replace(tzinfo=None) for d in datesB])
datesA_not_in_datesB = ~np.isin(datesA,datesB)
print(datesA_not_in_datesB)
>>> [False False False False  True  True False False False]
reshaped = datesA_not_in_datesB.reshape(-1,1)
print(reshaped)
>>> [[False]
[False]
[False]
[False]
[ True]
[ True]
[False]
[False]
[False]]

最新更新