2015-02-18 3 views
1

У меня есть сценарий, где я пишу веб-сервис JSON в базу геоданных Esri. Я получаю ошибку ValueError: не удалось преобразовать строку в float: MicrowavesValueError: не удалось преобразовать строку в float, NumPy

Я использовал тот же самый скрипт раньше, когда U40 был dtype для всех строк.

Мой сценарий и результаты приведены ниже;

import json 
import jsonpickle 
import requests 
import arcpy 
import numpy 

fc = "C:\MYLATesting.gdb\MYLA311" 
if arcpy.Exists(fc): 
    arcpy.Delete_management(fc) 

f = open('C:\Users\Administrator\Desktop\myla311.json', 'r') 

data = jsonpickle.encode(jsonpickle.decode(f.read())) 

url = "myUrl" 
headers = {'Content-type': 'text/plain', 'Accept': '/'} 

r = requests.post(url, data=data, headers=headers) 
sr = arcpy.SpatialReference(4326) 

decoded = json.loads(r.text) 

SRAddress = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['SRAddress'] 
latitude = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['Latitude'] 
longitude = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['Longitude'] 

CommodityType = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['ListOfLa311ElectronicWaste']['La311ElectronicWaste'][0]['Type'] 
ItemType = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['ListOfLa311ElectronicWaste']['La311ElectronicWaste'][0]['ElectronicWestType'] 
ItemCount = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['ListOfLa311ElectronicWaste']['La311ElectronicWaste'][0]['ItemCount'] 


CommodityType1 = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['ListOfLa311ElectronicWaste']['La311ElectronicWaste'][1]['Type'] 
ItemType1 = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['ListOfLa311ElectronicWaste']['La311ElectronicWaste'][1]['ElectronicWestType'] 
ItemCount1 = decoded['Response']['ListOfServiceRequest']['ServiceRequest'][0]['ListOfLa311ElectronicWaste']['La311ElectronicWaste'][1]['ItemCount'] 






print SRAddress 
print latitude 
print longitude 

print CommodityType 
print ItemType 
print ItemCount 






print CommodityType1 
print ItemType1 
print ItemCount1 



item ={'SRAddress': SRAddress, 'Longitude': longitude, 'Latitude': latitude, 'CommodityType': CommodityType, 'ItemType': ItemType, 'ItemCount': ItemCount} 
import numpy as np  #NOTE THIS 
keys = ['SRAddress','Longitude','Latitude','CommodityType','ItemType', 'ItemCount'] 
k1,k2,k3, k4, k5, k6 = keys 
data_line ={'SRAddress': SRAddress, 'Longitude': longitude, 'Latitude': latitude, 'CommodityType': CommodityType, 'ItemType': ItemType, 'ItemCount': ItemCount} 
frmt = '\nStraight dictionary output\n Address: {} Long: {} Lat: {}' 
print(frmt.format(item[k1],item[k2],item[k3], item[k4],item[k5], item[k6])) 
print '\noption 1: List comprehension with unicode' 
a = tuple([unicode(item[key]) for key in keys]) # list comprehension with unicode 
print('{}'.format(a)) 
dt = np.dtype([('SRAddress','U40'),('CommodityType','U40'), ('ItemType','U40'), ('ItemCount','U40'),('longitude','<f8'),('latitude','<f8')]) 
arr = np.array(a,dtype=dt) 
print'\narray unicode\n',arr 
print'dtype',arr.dtype 
print '\noption 2:List comprehension without unicode' 
b = tuple([item[key] for key in keys]) 
print('{}'.format(b)) 
dt = np.dtype([('SRAddress','U40'),('CommodityType','U40'), ('ItemType','U40'), ('ItemCount','U40'),('longitude','<f8'),('latitude','<f8')]) 
arr = np.array(b,dtype=dt) 
print'\narray without unicode\n',arr 
print'dtype',arr.dtype 

arcpy.da.NumPyArrayToFeatureClass(arr, fc, ['longitude', 'latitude'], sr) 

Результаты

C:\Python27\ArcGIS10.2\python.exe C:/MYLAScripts/MYLAJson.py 
Traceback (most recent call last): 
5810 N WILLIS AVE, 91411 
    File "C:/MYLAScripts/MYLAJson.py", line 71, in <module> 
34.176277 
    arr = np.array(a,dtype=dt) 
-118.455249 
ValueError: could not convert string to float: Microwaves 
Electronic Waste 
Microwaves 
3 
Electronic Waste 
Televisions (Any Size) 
6 

Straight dictionary output 
Address: 5810 N WILLIS AVE, 91411 Long: -118.455249 Lat: 34.176277 

option 1: List comprehension with unicode 
(u'5810 N WILLIS AVE, 91411', u'-118.455249', u'34.176277', u'Electronic Waste', u'Microwaves', u'3') 
+1

Мне любопытно, откуда «Микроволны». Я не вижу никакой ссылки на это в вашем коде, и вы, кажется, не читаете нигде. Кроме того, похоже, что numpy пытается конвертировать «Microwave» в float. Это может иметь отношение к массивам numpy, которые должны быть одного типа. – JonathanV

+1

его результат Это результат ItemType. –

ответ

1

Вы

keys = ['SRAddress','Longitude','Latitude','CommodityType','ItemType', 'ItemCount'] 

то скрипт делает кортеж значений из Словаре items, используя эти ключи в таком порядке:

a = tuple([unicode(item[key]) for key in keys]) 

Тогда w курица конвертировать этот кортеж в массив

arr = np.array(a,dtype=dt) 

он пытается запихнуть значение, связанное с ItemType в longitude поле структуры. Список keys должен быть в том же порядке, что и поля struct вашего dtype. В идеале вы даже не захотите копировать эту информацию и вместо этого использовать dt.names. Затем, пока поля структуры имеют те же имена, что и dict, который вы пытаетесь преобразовать, должны принимать значения в правильном порядке.

Смежные вопросы