2013-10-09 4 views
0

Я загрузил набор данных в формате xml с веб-страницы. Я извлек тег значений, используя библиотеку шаблонов python. Это дает мне значения unicode.Невозможно преобразовать данные в unicode в float

Я ищу для преобразования этого номера юникода, как 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: 
+0

Это, кажется, работает для меня ... http://repl.it/LUj – Lix

+0

'поплавок (u'63.3')' не выдаст ошибку. – user278064

+5

Если вы хотите поплавок, зачем вы пытаетесь использовать 'int()'? – unwind

ответ

2

, как об этом?

float(u'63.3') 

результат:

63.3 
+1

OP уже заявила, что они пробовали это ... так зачем публиковать это как ответ? – Lix

6

Это может быть возможно, что один из вашего персонажа (например, «») выглядит символ, который вы хотите иметь, но на самом деле является другой при проверке таблицы кодов.

Вы можете печатать все коды, написав

for c in a: 
    print ord(c) 

и сравнить значения, полученные с помощью Юникода кодовой страницы. Десятичная точка должна быть 46 (print ord(u'.')), номера должны быть в диапазоне 48..57.

Другая мысль: Вы проверили тип a? Возможно, это не объект unicode, а нечто более сложное. Тогда вы можете попробовать float(unicode(a)).

1

Таким образом, проблема была связана со значениями в поле тега «значение». Последние 6 записей в теге значений в разделе «Утверждение» и «Отклонить» были пустыми. Поэтому при попытке конвертировать их в float система выдала ошибку. Изменив итерацию, чтобы опустить эти значения, как показано ниже, код прошел нормально. В этом случае необходимо было следить за всем набором данных, а не обобщением. Спасибо всем за вклад.

#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) 
Смежные вопросы