Похоже, isnat
предназначен для тестирования массива, например:
In [47]: np.array([0,1,'NaT'], 'datetime64[D]')
Out[47]: array(['1970-01-01', '1970-01-02', 'NaT'], dtype='datetime64[D]')
In [48]: np.isnat(_)
Out[48]: array([False, False, True])
Я должен был поэкспериментировать, чтобы выяснить, как сгенерировать элемент NaT
. Могут быть и другие способы.
Можете ли вы предоставить кадр данных или серию, которые имеют значения выборки, как действительные даты, так и не даты. Это облегчит изучение способов фильтрации. Я считаю, что у панд есть какой-то элемент времени, но я не знаю, совместим ли он с numpy
. Имейте также в виду, что pandas
легко переключается на объект dtype, когда элементы Series включают строки, и None
.
Тестирование серии:
In [50]: ds = pd.Series(_47)
In [51]: ds
Out[51]:
0 1970-01-01
1 1970-01-02
2 NaT
dtype: datetime64[ns]
In [52]: ds.isna()
Out[52]:
0 False
1 False
2 True
dtype: bool
In [54]: ds.isnull()
Out[54]:
0 False
1 False
2 True
dtype: bool
Изменение элемента серии:
In [58]: ds[2]=12
In [59]: ds
Out[59]:
0 1970-01-01 00:00:00
1 1970-01-02 00:00:00
2 12
dtype: object
, который изменяет dtype
In [60]: ds.values
Out[60]:
array([Timestamp('1970-01-01 00:00:00'), Timestamp('1970-01-02 00:00:00'),
12], dtype=object)
In [61]: np.isnat(_)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-61-47ce91c66a51> in <module>
----> 1 np.isnat(_)
TypeError: ufunc 'isnat' is only defined for datetime and timedelta.
Возможная последовательность преобразования:
Ряд со смесью дат и чего-то еще, объект dtype:
In [118]: ds
Out[118]:
0 1970-01-01 00:00:00
1 1970-01-02 00:00:00
2 12
dtype: object
In [119]: ds1=pd.to_datetime(ds,errors='coerce')
In [120]: ds1
Out[120]:
0 1970-01-01
1 1970-01-02
2 NaT
dtype: datetime64[ns]
преобразование с помощью coerce дает NaT
:
In [121]: idx = np.isnat(ds1)
In [122]: idx
Out[122]:
0 False
1 False
2 True
dtype: bool
In [123]: ds1[idx]
Out[123]:
2 NaT
dtype: datetime64[ns]
, определяющее правильное значение по умолчанию;важен его тип d, поскольку pandas легко меняет тип d (numpy
нет):
In [124]: default= np.array('2020-12-31','datetime64[ns]')[()]
In [125]: default
Out[125]: numpy.datetime64('2020-12-31T00:00:00.000000000')
In [126]: ds1[idx]=default
In [127]: ds1
Out[127]:
0 1970-01-01
1 1970-01-02
2 2020-12-31
dtype: datetime64[ns]