Это старый вопрос, но есть еще один тонкий способ, которым это сообщение может случиться. Это объясняется довольно хорошо здесь, в документах .
Представьте это scenerio:
try {
// code that triggers a pdo exception
} catch (Exception $e) {
throw new MyCustomExceptionHandler($e);
}
И MyCustomExceptionHandler
определяется примерно так:
class MyCustomExceptionHandler extends Exception {
public function __construct($e) {
parent::__construct($e->getMessage(), $e->getCode());
}
}
Это фактически вызовет новое исключение в настраиваемом обработчике исключений, потому что класс Exception
ожидает число для второго параметра в его конструкторе, но PDOException
может динамически изменить возвращаемый тип $e->getCode()
в строку.
Обходным путем для этого было бы определить пользовательский обработчик исключений, например:
class MyCustomExceptionHandler extends Exception {
public function __construct($e) {
parent::__construct($e->getMessage());
$this->code = $e->getCode();
}
}
Чтобы ответить на вопрос о фильтрации, вы можете преобразовать в datetime
и удалить NaN.
ser[pd.to_datetime(ser, errors='coerce').notna()]
Или, если вы не возражаете, результатом является дата и время,
pd.to_datetime(ser, errors='coerce').dropna()
Это зависит от длины данных, но здесь для небольших данных (365 строк) быстрее понимание списка:
In [108]: %timeit (ser.apply(lambda x: isinstance(x, pd.Timestamp)))
434 µs ± 57.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [109]: %timeit ([isinstance(x, pd.Timestamp) for x in ser])
140 µs ± 5.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [110]: %timeit (pd.to_datetime(ser, errors='coerce').notna())
1.01 ms ± 25.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Но если тестировать больший DataFrame, то он быстрее to_datetime
с проверить не пропущенные значения по Series.isna
:
ser = pd.Series(pd.date_range('1980/01/05', '2020/01/05'))
ser.loc[3] = 4
print (len(ser))
14611
In [116]: %timeit (ser.apply(lambda x: isinstance(x, pd.Timestamp)))
6.42 ms ± 541 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [117]: %timeit ([isinstance(x, pd.Timestamp) for x in ser])
4.9 ms ± 256 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [118]: %timeit (pd.to_datetime(ser, errors='coerce').notna())
4.22 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)