2015-12-22 3 views
0

Я изучаю, как анализировать данные, которые я получаю от своих 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 

Каждое поле означает что-то и должно быть в определенном формате.

RMC Data Format

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) 
+0

* «Каждое поле означает что-то и должно быть в определенном формате». * - но '2454' не подтверждает' hhmmss.sss'. Я думаю, вы должны проверить свои входные данные. Кроме того, этот вопрос растет в третий раз - вы должны создать новый пост, если ваша оригинальная проблема была решена. – soon

ответ

1

По вашим данным, row[1] является '2454', однако, вы пытаетесь получить кусок от 4 до 6:

float(row[1][4:6]) 

который возвращает пустую строку.float не знает, как справиться с этим:

In [6]: float('') 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-6-ddb0cdb80cb6> in <module>() 
----> 1 float('') 

ValueError: could not convert string to float: 

В случае, если вы усечены данные, вы можете вручную расширить его с ведущими нулями:

In [11]: '2454'.zfill(6) # When `'2454'` is a `str` 
Out[11]: '002454' 

In [12]: '{:06}'.format(2454) # Another way 
Out[12]: '002454' 

In [13]: float('{:06}'.format(2454)[4:6]) 
Out[13]: 54.0 

UPD:

Похоже, что ваши данные могут быть проанализированы как обычные csv:

In [17]: list(csv.reader(['$GPRMC,002454,A,3553.5295,N,13938.6570,E,0.0,43.1,180700,7.1,W,A*3F'])) 
Out[17]: 
[['$GPRMC', 
    '002454', 
    'A', 
    '3553.5295', 
    'N', 
    '13938.6570', 
    'E', 
    '0.0', 
    '43.1', 
    '180700', 
    '7.1', 
    'W', 
    'A*3F']] 

Как видите, 002454 проанализирован без проблем, и вам не нужно расширять его с помощью ведущих нулей.

+0

Я думаю, проблема в том, что это происходит из файла csv, и я вручную ограничил книгу запятой. Теперь я тестирую «сырую» версию данных gps и вижу, могу ли я сделать такую ​​функцию, как «row = row.split («, »). «Необработанные» данные для gprmc выглядят следующим образом: $ GPRMC, 002454, A, 3553.5295, N, 13938.6570, E, 0,0,43,1,180700,7,1, W, A * 3F .......... ..Это будет иметь значение, я считаю, считая, что строка [1] станет «002454», если я выясню, как разделить данные. – Daniel

+0

Я обновил свой оригинальный вопрос ... не могли бы вы взглянуть? – Daniel

+0

@ Даниэль, я также обновил свой ответ, пожалуйста, взгляните на него – soon