Какой файл вызывает `dask.dataframe.read_csv`? - PullRequest
0 голосов
/ 08 ноября 2018

Я часто сталкиваюсь с ошибкой типа

>> dd.read_csv('/tmp/*.csv', parse_dates=['start_time', 'end_time'])

Traceback (most recent call last):
...
  File "/Users/brettnaul/venvs/model37/lib/python3.6/site-packages/dask/dataframe/io/csv.py", line 163, in coerce_dtypes
    raise ValueError(msg)
ValueError: Mismatched dtypes found in `pd.read_csv`/`pd.read_table`.

The following columns failed to properly parse as dates:

- start_time
- end_time

This is usually due to an invalid value in that column. To
diagnose and fix it's recommended to drop these columns from the
`parse_dates` keyword, and manually convert them to dates later
using `dd.to_datetime`.

Ясно, что один из моих файлов не отформатирован, но какой? Лучшее решение, которое я придумала до сих пор:

  • Перезапустить ту же команду в IPython
  • % отладочной магии
  • распечатать образец исходного CSV-текста на консоль
  • найти бит уникального текста и grep, пока я не выясню проблемный файл

Это кажется мне очень окольным, но если я не упустил что-то очевидное, не похоже, что в трассировке есть какая-то другая идентифицирующая информация. Есть ли лучший способ выяснить, какой файл не удается? Использование collection=False и проверка объектов Delayed также могут работать, но я не совсем уверен, что искать. Есть ли способ, чтобы возникшее исключение могло включать какой-то намек на то, где возникла проблема, или эта информация недоступна после вызова read_csv?

1 Ответ

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

Один из подходов может заключаться в том, чтобы включать имена файлов при чтении файлов, откладывать разбор даты (просто следуя предложению в сообщении об ошибке), обрабатывать ошибки как NaT с и выбирать проблемные в результате. В приведенном ниже примере 2.csv и 3.csv содержат проблемные значения:

In [45]: !cat 1.csv
a
2018-01-01
2018-01-02

In [46]: !cat 2.csv
a
2018-01-03
2018-98-04

In [47]: !cat 3.csv
a
2018-01-05b
2018-01-06

In [48]: !cat 4.csv
a
2018-01-07
2018-01-08

In [49]: df = dd.read_csv('*.csv', include_path_column=True)

In [50]: df['a'] = dd.to_datetime(df.a, errors='coerce')

In [51]: df[df['a'].isnull()].path.compute()
Out[51]: 
1    2.csv
0    3.csv

В частности, это говорит нам о том, что вторая строка (с индексом 1) в 2.csv и первая строка (с индексом 0) в 3.csv являются виновниками.

...