ValueError:无法将字符串转换为float,NumPy

时间:2015-02-18 22:48:54

标签: python numpy

我有一个脚本,我正在为Esri文件地理数据库编写JSON Web服务。我收到错误ValueError:无法将字符串转换为float:Microwaves

之前我使用了完全相同的脚本,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 个答案:

答案 0 :(得分:1)

你有

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

然后脚本按顺序使用这些键从dict items创建一个值元组:

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

然后将此元组转换为数组

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

它试图将与ItemType相关联的值填充到结构的longitude字段中。 keys列表的顺序应与dtype的struct字段的顺序相同。理想情况下,您甚至不会复制此信息,而是使用dt.names。然后,只要struct字段与您尝试转换的dict具有相同的名称,它就应该以正确的顺序获取值。