Ich habe eine Reihe von sehr chaotisch * .csv-Dateien, die von Pandas eingelesen werden. Ein Beispiel csv ist:Ignorieren schlechte Zeilen von Daten in pandas.read_csv(), die Kopfzeile brechen = Stichwort
Instrument 35392
"Log File Name : station"
"Setup Date (MMDDYY) : 031114"
"Setup Time (HHMMSS) : 073648"
"Starting Date (MMDDYY) : 031114"
"Starting Time (HHMMSS) : 090000"
"Stopping Date (MMDDYY) : 031115"
"Stopping Time (HHMMSS) : 235959"
"Interval (HHMMSS) : 010000"
"Sensor warmup (HHMMSS) : 000200"
"Circltr warmup (HHMMSS) : 000200"
"Date","Time","","Temp","","SpCond","","Sal","","IBatt",""
"MMDDYY","HHMMSS","","øC","","mS/cm","","ppt","","Volts",""
"Random message here 031114 073721 to 031114 083200"
03/11/14,09:00:00,"",15.85,"",1.408,"",.74,"",6.2,""
03/11/14,10:00:00,"",15.99,"",1.96,"",1.05,"",6.3,""
03/11/14,11:00:00,"",14.2,"",40.8,"",26.12,"",6.2,""
03/11/14,12:00:01,"",14.2,"",41.7,"",26.77,"",6.2,""
03/11/14,13:00:00,"",14.5,"",41.3,"",26.52,"",6.2,""
03/11/14,14:00:00,"",14.96,"",41,"",26.29,"",6.2,""
"message 3"
"message 4"**
Ich habe diesen Code wurde mit der * .csv-Datei, verarbeiten die doppelten Header, ziehen Sie die leeren Spalten importieren und dann mit schlechten Daten, die beanstandeten Zeilen Streifen:
DF = pd.read_csv(BADFILE,parse_dates={'Datetime_(ascii)': [0,1]}, sep=",", \
header=[10,11],na_values=['','na', 'nan nan'], \
skiprows=[10], encoding='cp1252')
DF = DF.dropna(how="all", axis=1)
DF = DF.dropna(thresh=2)
droplist = ['message', 'Random']
DF = DF[~DF['Datetime_(ascii)'].str.contains('|'.join(droplist))]
DF.head()
Datetime_(ascii) (Temp, øC) (SpCond, mS/cm) (Sal, ppt) (IBatt, Volts)
0 03/11/14 09:00:00 15.85 1.408 0.74 6.2
1 03/11/14 10:00:00 15.99 1.960 1.05 6.3
2 03/11/14 11:00:00 14.20 40.800 26.12 6.2
3 03/11/14 12:00:01 14.20 41.700 26.77 6.2
4 03/11/14 13:00:00 14.50 41.300 26.52 6.2
Dies funktioniert gut und schön, bis ich eine Datei, die eine erronious 1 Zeilenleitung nach dem Header hat: „Random Nachricht hier 031.114 073.721 bis 031.114 083.200“
der Fehler I ist receieve:
*C:\Users\USER\AppData\Local\Continuum\Anaconda3\lib\site-
packages\pandas\io\parsers.py in _do_date_conversions(self, names, data)
1554 data, names = _process_date_conversion(
1555 data, self._date_conv, self.parse_dates, self.index_col,
-> 1556 self.index_names, names,
keep_date_col=self.keep_date_col)
1557
1558 return names, data
C:\Users\USER\AppData\Local\Continuum\Anaconda3\lib\site-
packages\pandas\io\parsers.py in _process_date_conversion(data_dict,
converter, parse_spec, index_col, index_names, columns, keep_date_col)
2975 if not keep_date_col:
2976 for c in list(date_cols):
-> 2977 data_dict.pop(c)
2978 new_cols.remove(c)
2979
KeyError: ('Time', 'HHMMSS')*
Wenn ich diese Zeile entfernen, funktioniert der Code einwandfrei. Ähnlich, wenn ich die header = Zeile entferne, funktioniert der Code gut. Ich möchte dies jedoch beibehalten können, weil ich Hunderte von diesen Dateien lese.
Schwierigkeit: Ich würde nicht jede Datei vor dem Aufruf an pandas.read_csv() öffnen, da diese Dateien ziemlich groß sein können - also möchte ich nicht mehrere Male lesen und speichern! Außerdem würde ich eine echte Pandas/Python-Lösung bevorzugen, bei der die Datei nicht zuerst als StringIO-Puffer geöffnet wird, um störende Zeilen zu entfernen.
Können Sie die fehlerhafte Zeile schreiben? Ist es die gleiche Art von fehlerhafter Zeile, die in jedem Fall angezeigt wird, wenn Sie einen Fehler erhalten, oder gibt es andere Arten von Problemen in anderen Zeilen in einigen Dateien? –
die fehlerhafte Zeile, die den Fehler erstellt, ist: "zufällige Nachricht hier 031114 073721 bis 031114 083200" Diese Zeile möglicherweise oder möglicherweise nicht in allen Dateien vorhanden. Daher kann ich nicht nur den Index skiprows = erhöhen. Auch wenn ich den tatsächlichen Text dieser Zeile ändern, bleibt der Fehler bestehen - es ist egal, was der Text ist, aber das ist eine Zeile mit nur 1 Spalte nach der Überschrift. –