Эффективный способ проверить dtype каждой строки в серии

Это старый вопрос, но есть еще один тонкий способ, которым это сообщение может случиться. Это объясняется довольно хорошо здесь, в документах .

Представьте это 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();
  }
}

4
задан Josh Friedlander 3 March 2019 в 09:36
поделиться

2 ответа

Чтобы ответить на вопрос о фильтрации, вы можете преобразовать в datetime и удалить NaN.

ser[pd.to_datetime(ser, errors='coerce').notna()]

Или, если вы не возражаете, результатом является дата и время,

pd.to_datetime(ser, errors='coerce').dropna()
0
ответ дан cs95 3 March 2019 в 09:36
поделиться

Это зависит от длины данных, но здесь для небольших данных (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)
0
ответ дан jezrael 3 March 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: