isin не работает на ndarray даты и времени, кроме как с предупреждением об устаревании - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть два следующих массива datetimes:

dateA:

        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, которые НЕ в датах. Использование ~isin(), как показано ниже, возвращает True для всех строк, а не только строк, отсутствующих в dateB:

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

dateA, строки 4 и 5 ( datetime.datetime (2000, 1, 8, 0, 0) и datetime.datetime (2000, 1, 9, 0, 0) ) являются единственными записями, которые не указаны в dateB и должны возвращать True .

Я обнаружил, что эта проблема isin() не работает для дат, о которых сообщается в этих сообщениях:

Исправление, которое кто-то предлагает в постах выше:

datesA_not_in_datesB = ~np.isin(datesA.astype('datetime64[ns]'),datesB.astype('datetime64[ns]'))
​
C:\Users\Username\anaconda3\lib\site-packages\ipykernel_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]])

Это работает, кроме как я получаю предупреждающее сообщение:

DeprecationWarning: синтаксический анализ datetime с учетом timezone устарел; в будущем это вызовет ошибку "" "Точка входа для запуска ядра I Python.

Я попытался несколько вещей, чтобы удалить информацию о часовом поясе .replace(tzinfo=None) из dateB, чтобы сделать isnan работать без необходимости использовать .astype('datetime64[ns]') и найти решение без DeprecationWarning , но безрезультатно.

Может ли кто-нибудь посоветовать, как получить тот же результат, что и

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

но так, чтобы это не привело к предупреждению об устаревании ?

Большое спасибо за ваше время и помощь в этом.

1 Ответ

1 голос
/ 28 апреля 2020

Я удалил 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]]
...