将一些数据读入Python的最智能的方法

2024-05-14 05:37:56 发布

您现在位置:Python中文网/ 问答频道 /正文

以下链接有美联储公布的一些数据: http://www.federalreserve.gov/monetarypolicy/fomcprojtabl20150318.htm

我复制了最后一张表格,并将其粘贴到LibreOffice Calc中的电子表格中(为了清楚起见,该表格被称为“适当的政策确定速度:联邦基金利率目标范围或目标水平的中点”)。在

现在,我要做的就是把这个表读入一个numpy数组或python列表之类的,并能够对该表进行一些基本的描述性统计。请注意,表中有“空位置”,其中许多是空的。在

在将电子表格保存为联邦公开市场委员会.csv公司名称:

data = []
f = open('fomc.csv', 'rt')
reader = csv.reader(f)
for row in reader:
    data.append(row)
data

我得到一些奇怪的东西(很多'\xc2\xa0'):

^{pr2}$

所以,问题是:

所有这些字符串都是正常的吗?在

b)我是否应该使用(即,这是一种聪明的方法吗?)公司名称:

data = np.array([[el.replace('\xc2\xa0',' ') for el in row] for row in data])

c)将应为浮点值但为字符串的数据转换为浮点值的最佳方法是什么?我需要循环一下吗np.数组?在

考虑到第一篇专栏文章,我希望能够做一些类似的事情

data.T[0][1:] = [float(el) for el in data.T[0][1:]] 

但是这不起作用,因为你不能用这种方式改变数组的一部分。在


Tags: csv数据in名称目标fordata公司
2条回答

a)是的,这是正常的。您正在将UTF8编码的HTML内容粘贴到Calc中。该内容包括一个UTF8编码的无中断空格unicode字符,该字符用于表的空列。在

>>> s = '\xc2\xa0'    # UTF8 encoded string
>>> s.decode('utf8')
u'\xa0'
>>> import unicodedata
>>> print unicodedata.name(s.decode('utf8'))    # decode to unicode and lookup name
NO-BREAK SPACE

看起来像是用“普通”粘贴将表粘贴到Calc中。如果你选择了“非格式化的C”而不是“将数据粘贴到非格式化的C”中。另外,保存文件时,可以指定要使用的编码。选择UTF8或ASCII,因为该表中没有任何Unicode字符,因此两者的结果相同。在

b)如果您决定将未格式化文本粘贴到Calc中,则可以按如下方式处理文件:

^{pr2}$

data将包含:

^{3}$

我使用None来表示空列。您可以根据需要使用0或“”。另外,我没有将列标题复制粘贴到CSV文件中,因此我不必担心它们。在

c)参见b)-读取文件时,对所有非空字符串执行浮点转换。在

a)如果不使用与写入文件相同的编码方式来读取文件,则会出现错误字符。文件只不过是字节,它们可以根据编码进行不同的解释。”奇怪的“符号”几乎总是意味着你使用了错误的“解释”。在

b)打开文本文件时,应始终指定其编码。Python3强迫你这么做。在Python2中,您可以这样做:

from io import open

with open('fomc.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)

我试过你的例子,但不能重现同样的错误。我的列表中有空字符串代替空单元格。因为无论如何你都要用合理的默认值(例如0)来替换它们,不管怎样都可以。在

c)您应该清理csv complete中的输入,然后将其传递给numpy。在

您可以随时为其编写一个函数:

^{pr2}$

更正:正如nhawke所指出的,我在假设csv处理两个Python版本中的unicode时犯了一个错误。Python不是这样的。即使你正确地读了这个文件,它也会爆炸。在

不过,好消息是,csv并不是一种非常复杂的格式,因此通常您甚至不需要csv.reader来使用它。读取带有unicode字符的csv文件并将其转换为行列表非常简单

^{3}$

从那里你可以清理细胞,并继续如上所示。在

相关问题 更多 >