2013-08-02 23 views
6

Czytam plik danych obserwacji [RINEX-3.02] (strona 60), aby wykonać filtrowanie identyfikatorów satelitarnych według czasu i ostatecznie zrekonstruuję je. To dałoby mi większą kontrolę nad doborem satelitów, które pozwolą mi wnieść wkład w rozwiązanie pozycji w czasie z przetwarzaniem końcowym RTK.Czytanie danych GPS RINEX z Pandami

specjalnie dla tej części chociaż, po prostu na podstawie:

  • [pyton-3.3]
  • [pandy]
  • [numpy]

Oto przykład z pierwsze trzy znaczące obserwacje.
Uwaga: Nie ma potrzeby analizowania danych z nagłówka.

 3.02   OBSERVATION DATA M: Mixed   RINEX VERSION/TYPE 
CONVBIN 2.4.2       20130731 223656 UTC PGM/RUN BY/DATE 
log: /home/ruffin/Documents/Data/in/FlagStaff_center/FlagStaCOMMENT    
format: u-blox            COMMENT    
                  MARKER NAME   
                  MARKER NUMBER  
                  MARKER TYPE   
                  OBSERVER/AGENCY 
                  REC#/TYPE/VERS 
                  ANT #/TYPE   
    808673.9171 -4086658.5368 4115497.9775     APPROX POSITION XYZ 
     0.0000  0.0000  0.0000     ANTENNA: DELTA H/E/N 
G 4 C1C L1C D1C S1C          SYS/#/OBS TYPES 
R 4 C1C L1C D1C S1C          SYS/#/OBS TYPES 
S 4 C1C L1C D1C S1C          SYS/#/OBS TYPES 
    2013  7 28  0 27 28.8000000  GPS   TIME OF FIRST OBS 
    2013  7 28  0 43 43.4010000  GPS   TIME OF LAST OBS  
G               SYS/PHASE SHIFT 
R               SYS/PHASE SHIFT 
S               SYS/PHASE SHIFT 
    0               GLONASS SLOT/FRQ # 
C1C 0.000 C1P 0.000 C2C 0.000 C2P 0.000  GLONASS COD/PHS/BIS 
                  END OF HEADER  
> 2013 7 28 0 27 28.8000000 0 10      
G10 20230413.601  76808.847  -1340.996   44.000 
G 4 20838211.591  171263.904  -2966.336   41.000 
G12 21468211.719  105537.443  -1832.417   43.000 
S38 38213212.070  69599.2942  -1212.899   45.000 
G 5 22123924.655  -106102.481  1822.942   46.000 
G25 23134484.916  -38928.221   656.698   40.000 
G17 23229864.981  232399.788  -4048.368   41.000 
G13 23968536.158  6424.1143  -123.907   28.000 
G23 24779333.279  103307.5703  -1805.165   29.000 
S35 39723655.125  69125.5242  -1209.970   44.000 
> 2013 7 28 0 27 29.0000000 0 10      
G10 20230464.937  77077.031  -1341.254   44.000 
G 2 20684692.905  35114.399  -598.536   44.000 
G12 21468280.880  105903.885  -1832.592   43.000 
S38 38213258.255  69841.8772  -1212.593   45.000 
G 5 22123855.354  -106467.087  1823.084   46.000 
G25 23134460.075  -39059.618   657.331   40.000 
G17 23230018.654  233209.408  -4048.572   41.000 
G13 23968535.044  6449.0633  -123.060   28.000 
G23 24779402.809  103668.5933  -1804.973   29.000 
S35 39723700.845  69367.3942  -1208.954   44.000 
> 2013 7 28 0 27 29.2000000 0 9      
G10 20230515.955  77345.295  -1341.436   44.000 
G12 21468350.548  106270.372  -1832.637   43.000 
S38 38213304.199  70084.4922  -1212.840   45.000 
G 5 22123786.091  -106831.642  1822.784   46.000 
G25 23134435.278  -39190.987   657.344   40.000 
G17 23230172.406  234019.092  -4048.079   41.000 
G13 23968534.775  6473.9923  -125.373   28.000 
G23 24779471.004  104029.6643  -1805.983   29.000 
S35 39723747.025  69609.2902  -1209.259   44.000 

Jeśli muszę dokonać niestandardowego parsera,
Druga trudna rzeczą jest identyfikatory satelitarne przychodzą i odchodzą z biegiem czasu,
(jak pokazano z satelitów „G 2” i „G 4”)
(plus mają również spacje w identyfikatorach)
Czytając je w DataFrame,
muszę utworzyć nowe etykiety kolumn (lub etykiety wierszy dla MultiIndex?), Gdy je znajduję.

I początkowo myślałem, że to może być uznane za problem MultiIndex,
ale nie jestem tego taki pewien pandy read_csv może zrobić wszystko
Jump to Reading DataFrame objects with MultiIndex

sugestie?

odpowiednich źródeł przypadku zainteresowania:

+0

można dodać kilka linii danych fikcyjnych, trudnych do przypuszczenia bez. :) –

+0

Niestety, wystąpił błąd w formatowaniu i musiałem kontynuować publikowanie, aby debugować format. – ruffsl

Odpowiedz

3

Oto co skończyło się robi

df = readObs(indir, filename) 
df.set_index(['%_GPST', 'satID']) 

pamiętać, że wystarczy ustawić nowy MultiIndex w końcu po budowaniu. enter image description here

def readObs(dir, file): 
    df = pd.DataFrame() 
    #Grab header 
    header = '' 
    with open(dir + file) as handler: 
     for i, line in enumerate(handler): 
      header += line 
      if 'END OF HEADER' in line: 
       break 
    #Grab Data 
    with open(dir + file) as handler: 
     for i, line in enumerate(handler): 
      #Check for a Timestamp lable 
      if '> ' in line: 
       #Grab Timestamp 
       links = line.split() 
       index = datetime.strptime(' '.join(links[1:7]), '%Y %m %d %H %M %S.%f0') 
       #Identify number of satellites 
       satNum = int(links[8]) 
       #For every sat 
       for j in range(satNum): 
        #just save the data as a string for now 
        satData = handler.readline() 
        #Fix the names 
        satdId = satData.replace("G ", "G0").split()[0] 
        #Make a dummy dataframe 
        dff = pd.DataFrame([[index,satdId,satData]], columns=['%_GPST','satID','satData']) 
        #Tack it on the end 
        df = df.append(dff) 
    return df, header 

Korzystanie obojętne danych ramę po prostu nie wydaje się najbardziej elegancki choć.

+0

Czy udało Ci się stworzyć własny program do przetwarzania GNSS w języku Python? – multigoodverse

+0

Zrobiłem wiele skryptów z notebookami IPython, nie tak naprawdę program mówi. Możesz znaleźć moje rozważania [tutaj] (https://github.com/ruffsl/RTKLIB-Tools), ale nie tknąłem tego od jakiegoś czasu. Widzę, że bardzo interesujesz się pythonem i GIS, czy w ciągu ostatniego roku pojawiły się obiecujące narzędzia GNSS do Pythona, a co za tym idzie - @ArditS.? Widzę, że [RTKLIB] (https://github.com/tomojitakasu/RTKLIB/network) (mimo że projekt C) był dość aktywny. – ruffsl

1

Proponuję napisać niestandardowy parser, odczytać pliku linia po linii.

Przestrzeń pomiędzy słowami "G 5" jest dodatkową wskazówką do napisania niestandardowego analizatora składni.
W takim przypadku nie można podzielić argumentów po prostu spacją,
musisz przeczytać wszystkie 3 znaki jednocześnie i usunąć pierwszy znak, a pozostałe dwa ("5") przekształcić na numer satelity.

+0

Gdy przeglądam plik, jaki byłby sposób dodawania nowych kolumn do ramki danych podczas napotykania nowych identyfikatorów satelitów? Nic mi nie jest na wartości. – ruffsl

+0

Chciałbym posortować listę rosnąco rosnąco przez SAT to może mapMap (w java), z kluczem (Sat Id, wartość = reszta atts). Może dla każdego z systemów GPS Sat (Czy to pierwsza litera "G" i "S") własna lista lub drzewo. – AlexWien