Pandas读取CSV文件时出现错误

8

以下是我的csv文件(MQM Q.csv):

Date-Time,Value,Grade,Approval,Interpolation Code 
31/08/2012 12:15:00,,41,1,1 
31/08/2012 12:30:00,,41,1,1 
31/08/2012 12:45:00,,41,1,1 
31/08/2012 13:00:00,,41,1,1 
31/08/2012 13:15:00,,41,1,1 
31/08/2012 13:30:00,,41,1,1 
31/08/2012 13:45:00,,41,1,1 
31/08/2012 14:00:00,,41,1,1 
31/08/2012 14:15:00,,41,1,1

第一行没有“Value”项,但后面开始有。
下面是我的代码:
import pandas as pd 
from StringIO import StringIO
Q = pd.read_csv(StringIO("""/cygdrive/c/temp/MQM Q.csv"""), header=0, usecols=["Date-Time", "Value"], parse_dates=True, dayfirst=True, index_col=0)

I get the following error:

Traceback (most recent call last):
  File "daily.py", line 4, in <module>
    Q = pd.read_csv(StringIO("""/cygdrive/c/temp/MQM Q.csv"""), header=0, usecols=["Date-Time", "Value"], parse_dates=True, dayfirst=True, index_col=0)
  File "/usr/lib/python2.7/site-packages/pandas-0.14.0-py2.7-cygwin-1.7.30-x86_64.egg/pandas/io/parsers.py", line 443, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/lib/python2.7/site-packages/pandas-0.14.0-py2.7-cygwin-1.7.30-x86_64.egg/pandas/io/parsers.py", line 228, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/lib/python2.7/site-packages/pandas-0.14.0-py2.7-cygwin-1.7.30-x86_64.egg/pandas/io/parsers.py", line 533, in __init__
    self._make_engine(self.engine)
  File "/usr/lib/python2.7/site-packages/pandas-0.14.0-py2.7-cygwin-1.7.30-x86_64.egg/pandas/io/parsers.py", line 670, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/lib/python2.7/site-packages/pandas-0.14.0-py2.7-cygwin-1.7.30-x86_64.egg/pandas/io/parsers.py", line 1067, in __init__
    col_indices.append(self.names.index(u))
ValueError: 'Value' is not in list

你能否格式化你的数据或提供一个链接,因为我无法重现你的错误,也不清楚格式化出了什么问题。 - EdChum
1
以下代码对我有用: pd.read_csv(io.StringIO(temp),header=0, usecols=["Date-Time", "Value"], parse_dates=True, dayfirst=True, index_col=0),那么你使用StringIO是不必要的,这可能是问题所在。 - EdChum
你能澄清一下io和temp被设置成了什么吗? - Sid Kwakkel
你能否将数据的链接发布出来,因为你粘贴的数据有效。同时,请尝试使用以下代码:pd.read_csv('/cygdrive/c/temp/MQM Q.csv',header=0, usecols=["Date-Time", "Value"], parse_dates=True, dayfirst=True, index_col=0) - EdChum
@user1571934 不,Ed的代码是正确的(在0.14.0上有效)。您使用的pandas版本是什么?另一个选项是不使用usecols(读取后只选择所需列)。 - Andy Hayden
显示剩余7条评论
3个回答

5
这似乎是csv解析器的一个bug,首先这个是有效的:
df = pd.read_csv('MQM Q.csv')

同时这个也可以运行:

df = pd.read_csv('MQM Q.csv', usecols=['Value'])

但是,如果我想要Date-Time,那么它会出现与您相同的错误消息。

所以我注意到它是utf-8编码的,因此我使用notepad++转换为ANSI,然后它就可以工作了,我尝试了没有BOM的utf-8,也可以工作。

然后我将其转换为utf-8(可能现在有一个BOM),并且它失败了,与之前相同的错误,所以我认为您现在不再想象这个问题,这看起来像是一个bug。

我使用python 3.3,pandas 0.14和numpy 1.8.1。

为了解决这个问题,请执行以下操作:

df = pd.read_csv('MQM Q.csv', usecols=[0,1], parse_dates=True, dayfirst=True, index_col=0)

这将把你的索引设置为日期时间列,这会正确地转换为datetimeindex。
In [40]:

df.index
Out[40]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2012-08-31 12:15:00, ..., 2013-11-28 10:45:00]
Length: 43577, Freq: None, Timezone: None

大佬,感谢你提到BOM问题。我不知道自己有多少次因为这个“错误”而苦恼。只是将文件重新保存为UTF无BOM格式,问题就立刻解决了。 - djnz0feh
2
@djnz0feh 我认为实际上只需要在传递 encoding='utf-8' 参数时就可以正常工作了:df = pd.read_csv('MQM Q.csv', usecols=[0,1], parse_dates=True, dayfirst=True, index_col=0, encoding='utf-8') - EdChum
应该将这个放在答案中。 - Tunn

0

您的代码应该这样写(文件名不需要从StringIO获取):

import pandas as pd 
Q = pd.read_csv("/cygdrive/c/temp/MQM Q.csv"), header=0, usecols=["Date-Time", "Value"], parse_dates=True, dayfirst=True, index_col=0)

否则/目前pandas正在尝试将路径字符串(的路径)读取为DataFrame:
In [11]: pd.read_csv(StringIO("""/cygdrive/c/temp/MQM Q.csv"""))
Out[11]:
Empty DataFrame
Columns: [/cygdrive/c/temp/MQM Q.csv]
Index: []

这显然不是你想要的(因此你看到了“值不是列”的异常)。


我在你的代码行中遇到了以下错误... ValueError: 'Date-Time' 不在列表中 - Sid Kwakkel

0
以下是我使用的代码(我将CSV文件放在与脚本相同的目录中,但这并不重要)。我在我的Mac上运行以下脚本,而不是Cygwin,但它应该以相同的方式工作:
import pandas as pd 
Q = pd.read_csv("MQM Q.csv",
        header=0,
        parse_dates=True, 
        dayfirst=True,
        index_col=0,
        usecols=["Date-Time", "Value"])
print Q

讨论

  • StringIO不会起作用,除非您使用文件的内容而不是文件名创建一个新的StringIO对象。
  • 我对“日期-时间”列没有任何问题。实际上,之前的代码运行时没有任何错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接