2015-07-02 3 views
0

У меня есть сценарий, который читает некоторые данные измерений в форме CSV, а затем делает все виды заговора и прочее с ним.Импорт CSV со случайным числом столбцов

Теперь у меня есть новый набор данных, где какой-то идиот сочтет это полезным, чтобы добавить некоторые случайные комментарии в конце строки, например:

01.02.1988 00:00:00 ; 204.94  
01.03.1988 00:00:00 ; 204.87 ; something 
01.04.1988 00:00:00 ; 205.41  
01.05.1988 00:00:00 ; 205.64 ; something ; something else  
01.06.1988 00:00:00 ; 205.59 ; also something  
01.07.1988 00:00:00 ; 205.24 

, который дает мне хорошую

ValueError: Expected 2 fields in line 36, saw 3 

и так далее.

Согласно this и this При чтении я должен использовать аргумент names=['whatever','else'].

Но как-то это все происходит не так. Так вот некоторые примеры:

CSV файл

Stuff 
more stuff I dont need 
Date;level;crap1;crap2;crap3;crap4;crap5;crap6 
01.01.1988 00:00:00 ; 204.87  
01.02.1988 00:00:00 ; 204.94  
01.03.1988 00:00:00 ; 204.87 

«хорошо» заголовок, очевидно, «ручной», но я просто должен быть в состоянии пропустить это !?

CSV читатель

ValReader = pd.read_csv(csv_list[counter],sep=r'\s*;',skiprows=DateStart,names=['Date','level','crap1','crap2','crap3','crap4','crap5','crap6'],usecols=['Date','level'],index_col='Date',dayfirst=True,parse_dates=True) 

Что я получаю

print 'ValReader' 
         level 
Date       
Date      level 
01.04.2003 00:00:00  200.76 
01.05.2003 00:00:00  200.64 
01.06.2003 00:00:00  200.53 

Какой следующий, что вызывает уровень, чтобы получить обрабатываются как строки.

OK, легкий, что руководство строке заголовка в CSV (который хорошо работал в предыдущей версии, которая была только обрабатывать хорошие данные) является виновником, так что я просто установить skiprows к skiprows=DateStart+1, но результаты в

ValueError: Number of passed names did not match number of header fields in the file 

Так что, очевидно, я полностью потерял то, как панды обрабатывают имена и позиции столбцов.

ответ

0

У меня тоже была эта проблема, но вот решение.

Один из способов решить это для НЕ использовать регулярное выражение для разбора разделитель, как это возвращается к питона двигателя, в то время как в C двигателя, вы можете пропустить плохие линии предупреждения, и вы можете указать, какие колонки вы хотите.

Например:

In [1]: import io 

In [2]: import pandas as pd 

In [3]: s = io.StringIO(u'''Stuff 
more stuff I dont need 
Date;level;crap1;crap2;crap3;crap4;crap5;crap6 
01.01.1988 00:00:00 ; 204.87 
01.02.1988 00:00:00 ; 204.94 
01.03.1988 00:00:00 ; 204.87 ''') 
# I use skiprows=2 instead of DateStart here 
# after settings error_bad_lines=False, you can parse the csv OK... 
In [4]: ValReader = pd.read_csv(s, sep=';', skiprows=2, usecols=['Date', 'level'], 
           index_col='Date', dayfirst=True, parse_dates=True, 
           error_bad_lines=False) 

In [5]: ValReader 
Out[5]: 
      level 
Date 
1988-01-01 204.87 
1988-02-01 204.94 
1988-03-01 204.87 

In [6]: ValReader['level'].dtype 
Out[6]: dtype('float64') 

Надеется, что это помогает для вопросов, которые вы имеете.

+0

Я забыл, почему именно я использовал регулярное выражение, но я помню, что некоторые проблемы с различными пространствами были заполнены до и после ';'. Но, похоже, это работает. Однако теперь, кажется, игнорируется 'na_values ​​= 'hole'', который я добавил, и, следовательно, ошибки с' ValueError: невозможно преобразовать строку в float: hole'. Я буду играть немного больше и посмотреть, что могло бы вызвать это. –

+0

@JC_CL, на мой взгляд, обычно существуют способы устранить использование регулярного выражения в файле csv. Для вашего случая использования, если требуемые поля не содержат шумных ';', вы можете анализировать данные как есть и очищать шум после этого. Но в любом случае надеюсь, что вы можете понять это и удачи :) – Anzel

+0

Я не уверен, что действительно изменилось в моих данных, или что еще я изменил в своем сценарии, но пока не работает regexless 'sep'. Я не мог понять, что, черт возьми, случилось с моими «na_values», поэтому я сделал это жестоким образом и изменил «дыру» на «NaN» с sed в моей предварительной обработке. Не элегантный, но, похоже, он работает. Выключить следующий момент WTF, затем ... –

Смежные вопросы