我有一个脚本,它以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
在此之后,导致级别被处理为字符串。
好的,简单的,CSV中的手动标题行(在以前的版本中运行良好,只需要处理好数据)是罪魁祸首,所以我只需将skiprows
设置为skiprows=DateStart+1
,但结果是
ValueError: Number of passed names did not match number of header fields in the file
所以很明显我完全迷失了pandas如何处理列的名称和位置。
答案 0 :(得分:0)
我以前也遇到过这个问题,但这是一个解决方案。
解决这个问题的一种方法是 NOT 使用正则表达式解析分隔符,因为这会回退到 python 引擎,而在 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')
希望这有助于解决您遇到的问题。