Я изучаю, как анализировать данные, которые я получаю от своих gps, и изучал книгу о разработке сценариев визуальных преобразований. Я использую python34 и данные, которые я смотрю на выглядит следующим образом:ValueError: не удалось преобразовать строку в float во время анализа NMEA
['$GPRMC', '2454', 'A', '3553.5295', 'N', '13938.657', 'E', '0', '43.1', '180700', '7.1', 'W', 'A*3F', '', '', '', '', '', '', '']
['$GPRMB', 'A', '', '', '', '', '', '', '', '', '', '', '', 'A', 'A*0B', '', '', '', '', '']
['$GPGGA', '2454', '3553.5295', 'N', '13938.657', 'E', '1', '5', '2.2', '18.3', 'M', '39', 'M', '', '*7F', '', '', '', '', '']
['$GPGSA', 'A', '3', '1', '4', '7', '16', '20', '', '', '', '', '', '', '', '3.6', '2.2', '2.7*35', '', '']
['$GPGSV', '3', '1', '9', '1', '38', '103', '37', '2', '23', '215', '0', '4', '38', '297', '37', '5', '0', '328', '00*70']
['$GPGSV', '3', '2', '9', '7', '77', '299', '47', '11', '7', '87', '0', '16', '74', '41', '47', '20', '38', '44', '43*73']
['$GPGSV', '3', '3', '9', '24', '12', '282', '00*4D', '', '', '', '', '', '', '', '', '', '', '', '']
['$GPGLL', '3553.5295', 'N', '13938.657', 'E', '2454', 'A', 'A*4F', '', '', '', '', '', '', '', '', '', '', '', '']
['$GPBOD', '', 'T', '', 'M', '', '*47', '', '', '', '', '', '', '', '', '', '', '', '', '']
['$PGRME', '8.6', 'M', '9.6', 'M', '12.9', 'M*15', '', '', '', '', '', '', '', '', '', '', '', '', '']
['$PGRMZ', '51', 'f*30', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['$HCHDG', '101.1', '', '', '7.1', 'W*3C', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['$GPRTE', '1', '1', 'c', '*37', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
['$GPRMC', '2456', 'A', '3553.5295', 'N', '13938.657', 'E', '0', '43.1', '180700', '7.1', 'W', 'A*3D', '', '', '', '', '', '', '']
Сейчас я сосредоточен на $ GPGSV и $ GPRMC линий.
У меня есть определение, которое для обработки данных GPS, NMEA 0183 Формат:
def process_gps_data(data):
"""Processes GPS data, NMEA 0183 format.
Returns a tuple of arrays: latitude, longitude, velocity [km/h],
time [sec] and number of satellites.
See also: http://www.gpsinformation.org/dale/nmea.htm.
"""
latitude = []
longitude = []
velocity = []
t_seconds = []
num_sats = []
for row in data:
if row[0] == '$GPGSV':
num_sats.append(float(row[3]))
elif row[0] == '$GPRMC':
t_seconds.append(float(row[1][0:2])*3600 + \
float(row[1][2:4])*60+float(row[1][4:6]))
latitude.append(float(row[3][0:2]) + \
float(row[3][2:])/60.0)
longitude.append((float(row[5][0:3]) + \
float(row[5][3:])/60.0))
velocity.append(float(row[7])*NMI/1000.0)
return (array(latitude), array(longitude), array(velocity), array(t_seconds), array(num_sats))
(latitude, longitude, velocity, t_seconds, num_sats) = process_gps_data(y)
Но мне кажется, что я получаю эту ошибку:
Traceback (most recent call last):
File "C:\Python34\nmea_practice.py", line 112, in <module>
(latitude, longitude, velocity, t_seconds, num_sats) = process_gps_data(y)
File "C:\Python34\nmea_practice.py", line 102, in process_gps_data
float(row[1][2:4])*60+float(row[1][4:6]))
ValueError: could not convert string to float:
Я думал python3.x должен отлично работать с делениями с плавающей запятой по умолчанию?
Не могли бы вы рассказать мне, что я должен делать по-другому?
ADDED INFO.
Первоначально я вручную разделителями CSV-запятыми, потому что остальная часть моего сценария требуется, чтобы данные были разделены, чтобы создать такое определение:
#Counts the number of times a GPS command is observed
def list_gps_commands(data):
"""Counts the number of times a GPS command is observed.
Returns a dictionary object."""
gps_cmds = dict()
for row in data:
try:
gps_cmds[row[0]] += 1
except KeyError:
gps_cmds[row[0]] = 1
return gps_cmds
print(list_gps_commands(x))
print ("- - - - - - - - - - - - -")
Исходные данные выглядели как это прежде, чем я разделителями его запятыми вручную:
['$GPRMC,002454,A,3553.5295,N,13938.6570,E,0.0,43.1,180700,7.1,W,A*3F']
Любые предложения о том, как я мог бы «разбить», что хватит достаточно для «list_gps_commands и решить плавающую ошибку?
ADDED INFO 2
Что я получаю сырые данные NMEA от моего GPS устройства. Сейчас это Garmin_etrex_summit. У меня есть данные внутри csv, а данные - одна длинная строка для каждой строки. Если вы можете продолжить и посмотреть форматирование строки $ GPRMC, вы увидите, что в общей сложности есть 13 полей, разделенных запятыми.
$GPRMC,002454,A,3553.5295,N,13938.6570,E,0.0,43.1,180700,7.1,W,A*3F
Каждое поле означает что-то и должно быть в определенном формате.
row[1] = hhmmss.sss (UTC Time)
row[3] = ddmm.mmmm (Latitude)
row[5] = ddmm.mmmm (Longitude)
row[7] = anything with decimal place (Velocity in knots)
* «Каждое поле означает что-то и должно быть в определенном формате». * - но '2454' не подтверждает' hhmmss.sss'. Я думаю, вы должны проверить свои входные данные. Кроме того, этот вопрос растет в третий раз - вы должны создать новый пост, если ваша оригинальная проблема была решена. – soon