我有一系列凌乱的*.csv文件被熊猫读入。csv示例如下:
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"**
我一直在使用此代码导入*csv文件,处理双标题,拉出空列,然后用错误数据剥离有问题的行:
^{pr2}$这一切都很顺利,直到我有一个文件,在标题后面有一行错误的1行:“Random message here 031114 073721 to 031114 083200”
我收到的错误是:
*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')*
如果我删除这行代码,代码就可以正常工作了。类似地,如果我删除头=行,代码就可以正常工作。但是,我希望能够保存这个,因为我正在阅读数百个这样的文件。在
困难:在调用熊猫.read_csv()因为这些文件可能相当大,所以我不想多次读取和保存!另外,我更喜欢一个真正的pandas/pythonic解决方案,它不需要首先将文件作为stringIO缓冲区打开,而不是删除有问题的行。在
昨天经过一番修修补补,我找到了一个解决方案,以及可能存在的问题。在
我尝试了上面的skip_test()函数答案,但是我仍然得到表格大小的错误:
所以,在玩了skiprows=之后,我发现我在使用引擎时并没有得到想要的行为。read_csv()仍在根据前几行确定文件的大小,其中一些单列行仍在传递。可能是我的csv集中还有一些我没有计划好的单列行。在
相反,我创建了一个任意大小的数据帧作为模板。我拉入整个.csv文件,然后使用逻辑将NaN行剥离出来。在
例如,我知道我将遇到的数据最大的表将是10行长。所以我对熊猫的呼吁是:
^{pr2}$然后我使用这两行从数据帧中删除NaN行和列:
这里有一种方法,利用
skip_rows
接受可调用函数这一事实。函数只接收正在考虑的行索引,这是该参数的一个内置限制。在因此,可调用函数
skip_test()
首先检查当前索引是否在要跳过的已知索引集中。如果不匹配,则打开实际文件并检查相应的行以查看其内容是否匹配。在skip_test()
函数在检查实际文件的意义上有点粗糙,尽管它只检查当前的行索引。它还假设坏行总是以同一个字符串开头(在示例中,"foo"
),但这似乎是一个安全的假设如果您确切地知道随机消息出现在哪一行,那么这将快得多,因为您可以告诉它不要检查文件内容中是否有超过潜在违规行的索引。在
相关问题 更多 >
编程相关推荐