0

我从在线网页下载了一个 xml 格式的数据集。我已经使用 python 的模式库提取了值标签。这给了我 unicode 值。

我希望将此 unicode 数字(如 u'63.3')转换为浮点数。我试过做 float(a) 但它给出了错误消息。

import numpy as np
import pandas as pd
import requests
from pattern import web

xml = requests.get('http://charts.realclearpolitics.com/charts/1044.xml').text
dom = web.Element(xml)
values = dom.by_tag('value')

date= []
approve = []
disapprove = []

values = dom.by_tag('value')
for i in range(0,1724):
    date.append(pd.to_datetime(values[i].content))

for i in range(1724,3448):
    a = float(values[i].content)
    approve.append(a)

for i in range(3448,5172):
    a = float(values[i].content)
    disapprove.append(a)

finalresult = pd.DataFrame({'date': date, 'Approve': approve, 'Disapprove': disapprove})
finalresult

输出如下:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-d9d9e580d883> in <module>()
      9 
     10 for i in range(1724,3448):
---> 11     a = float(values[i].content)
     12     result['Approve'].append(a)
     13 
    ValueError: could not convert string to float:
4

3 回答 3

6

您的一个字符(例如“.”)可能看起来像您想要的字符,但在检查代码表时实际上是另一个字符。

您可以通过编写打印所有代码

for c in a:
    print ord(c)

并将您获得的值与 unicode 代码页进行比较。小数点应为 46 ( print ord(u'.')),数字应在 48..57 范围内。

另一个想法:你检查过 的类型a吗?也许它不是一个 unicode 对象,而是更复杂的东西。float(unicode(a))那你可以试试

于 2013-10-10T04:07:40.007 回答
2

这个怎么样?

float( u'63.3')

结果:

63.3
于 2013-10-09T11:21:20.337 回答
1

所以问题似乎出在“值”标签字段中的值上。“批准”和“不批准”下的值标签中的最后 6 个条目为空白。因此,在尝试将它们转换为浮动时,系统出现了错误。通过调整迭代以省略这些值,如下所示,代码运行良好。在这种情况下,需要关注整个数据集而不是一概而论。感谢大家的投入。

#The last range number below is 1720 instead of 1727 as last 6 values of Approve & Disapprove tag are blank. 
for i in range(0,1720):
    date.append(pd.to_datetime(values[i].content))

#The last range number below is 3447 instead of 3454 as last 6 values are blank. Including till 3454 will give error while converting to float. 
for i in range(1727,3447):
    a = float(values[i].content)
    approve.append(a)

#The last range number below is 5174 instead of 5181 as last 6 values are blank.
for i in range(3454,5174):
    a = float(values[i].content)
    disapprove.append(a)
于 2013-10-13T11:31:17.427 回答