Панды сбрасывают строки при сбое parse_dates - PullRequest
0 голосов
/ 07 сентября 2018

Я столкнулся с проблемой, я думал, что умные люди в Пандас уже решили, но я не могу найти ничего, так что я здесь.

Проблема, с которой я столкнулся, связана с некоторыми неверными данными, которые, как я ожидал, панды смогут фильтровать при чтении. Данные выглядят так:

Station;Datum;Zeit;Lufttemperatur;Relative Feuchte;Wettersymbol;Windgeschwindigkeit;Windrichtung
9;12.11.2016;08:04;-1.81;86;;;
9;12.11.2016;08:19;-1.66;85.5;;;
9;²;08:34;-1.71;85.6;;;
9;12.11.2016;08:49;-1.91;87.7;;;
9;12.11.2016;09:04;-1.66;86.6;;;

(используется набор символов ISO-8859-1, в UTF-8 и т. Д. Он выглядит по-другому). Я хочу прочитать второй столбец как даты, поэтому, естественно, я использовал

data = pandas.read_csv(file, sep=";", encoding="ISO-8859-1", parse_dates=["Datum"], 
                       date_parser=lambda x: pandas.to_datetime(x, format="%d.%m.%Y"))

который дал

ValueError: time data '²' does not match format '%d.%m.%Y' (match)

Несмотря на то, что pandas.read_csv имеет входной параметр error_bad_lines , который выглядит так, как будто это поможет мне, похоже, все, что он делает, это отфильтровывает строки, которые не имеют правильного количества столбцов. Теперь я могу отфильтровать эту конкретную строку многими различными способами, и, насколько мне известно, все они требуют сначала загрузить все данные, отфильтровать строки и затем преобразовать столбец в объекты даты и времени, но я бы предпочел сделать это при чтении в файле. Это представляется возможным, поскольку, когда я опускаю date_parser, файл успешно анализируется, а странный символ просто остается как есть (хотя это может вызвать проблемы при выполнении инструкций datetime позже).

Есть ли способ для панд отфильтровывать строки, в которых он не может использовать date_parser при чтении файла вместо во время постобработки?

1 Ответ

0 голосов
/ 07 сентября 2018

Вы хотите использовать параметр errors в pandas.to_datetime

date_parser=lambda x: pd.to_datetime(x, errors="coerce")

file = "file.csv"

data = pd.read_csv(
    file, sep=";", encoding="ISO-8859-1", parse_dates=["Datum"],
    date_parser=lambda x: pd.to_datetime(x, errors="coerce")
)

data

   Station      Datum   Zeit  Lufttemperatur  Relative Feuchte  Wettersymbol  Windgeschwindigkeit  Windrichtung
0        9 2016-12-11  08:04           -1.81              86.0           NaN                  NaN           NaN
1        9 2016-12-11  08:19           -1.66              85.5           NaN                  NaN           NaN
2        9        NaT  08:34           -1.71              85.6           NaN                  NaN           NaN
3        9 2016-12-11  08:49           -1.91              87.7           NaN                  NaN           NaN
4        9 2016-12-11  09:04           -1.66              86.6           NaN                  NaN           NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...