проблема панд с пандами.NaT при изменении - PullRequest
0 голосов
/ 20 ноября 2018

Поскольку pandas 0.23.4, pandas._libs.tslib.NaTType полностью устарела, поэтому я должен использовать pandas.NaT, как указано в 0.23.2 changelog,

The type import pandas.tslib.NaTType is deprecated and can be replaced by using type(pandas.NaT)

Но когда я попробовал следующий код,

from pandas import NaT
val_type = type(val)

if issubclass(val_type, NaT):
   return 'NaT'

Я получил ошибку,

TypeError: issubclass() arg 2 must be a class or tuple of classes

Если я попытаюсь,

if isinstance(val_type, NaT):
   return 'NaT'

Я получил следующую ошибку,

TypeError: isinstance() arg 2 must be a type or tuple of types

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Вам нужно указать isinstance() фактический тип, который вы ищете.В этом случае я бы сделал type(df.loc[knownnatdata) и использовал бы это как вход для метода.Например, я заполнил столбец данных с pd.NaT

df = pd.DataFrame([[1,1],[3,4],[3,4]], columns=["a", 'b'])
df['c'],df['d']=np.nan, pd.NaT

    a   b   c   d
0   1   1   NaN NaT
1   3   4   NaN NaT
2   3   4   NaN NaT

Затем type(df['d'].iloc[0]) дает мне pandas._libs.tslibs.nattype.NaTType (который все еще является типом в моей версии, но учтите, что он все еще не ПРОСТО NaT)

, с которым я сравниваю

isinstance(df['d'].iloc[0],pd._libs.tslibs.nattype.NaTType)
True
0 голосов
/ 20 ноября 2018

Чтобы немного пояснить другие ответы:

pandas._libs.tslibs.nattype.NaTType - это класс, определенный здесь .

class NaTType(_NaT):
    """(N)ot-(A)-(T)ime, the time equivalent of NaN"""

pandas.NaT (приведен в верхуровня имен) является экземпляром указанного выше класса, определенным здесь :

NaT = NaTType()

С причиной

Это псевдо-родной стражзначение, которое может быть представлено NumPy в единственном dtype (datetime64 [ns]).

issubclass() требует, чтобы вы передали фактический класс, а не экземпляр класса, и использование type(pd.NaT) сделаетэто для вас без прямого доступа к любому «непубличному» API.

0 голосов
/ 20 ноября 2018

Ну, как подсказывает сообщение об устаревании, вы должны использовать type(pandas.NaT), а не NaT напрямую.Так что, если вы импортировали имя, вы можете сделать issubclass(val_type, type(pandas.NaT)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...