2013-08-02 164 views
6

我正在閱讀[RINEX-3.02](第60頁)觀測數據文件以執行一些基於時間的衛星ID過濾,並且最終將對其進行重構。這可以讓我更好地控制我選擇的衛星,這些衛星我可以通過RTK後期處理隨着時間的推移對位置解決方案做出貢獻。使用Pandas讀取GPS RINEX數據

專門爲這一部分雖然,我只使用:

  • [蟒-3.3]
  • [熊貓]
  • [numpy的]

這裏是與樣品前三個時間標記的觀察。
注意:我不需要解析標題中的數據。

 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 

如果我必須做出一個自定義的解析器,
另一個棘手的事情是衛星的ID來來去去,隨着時間的推移,
(如圖所示與衛星「G 2」和「G 4」)
(再加上它們在ID中也有空格)
因此,當我將它們讀入DataFrame中時,我需要爲我找到新的列標籤(或MultiIndex的行標籤?)。

我最初想這可以被認爲是一個多指標問題,
但我不那麼肯定大熊貓read_csv能做的一切
Jump to Reading DataFrame objects with MultiIndex

有什麼建議?如果有興趣

相關來源:

+0

你能否添加幾行虛擬數據,很難猜測沒有。 :) –

+0

對不起,格式化有一些錯誤,並不得不繼續發佈調試格式。 – ruffsl

回答

3

以下是我最後做

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

注意構建它之後,我剛剛設置的新的多指標底。 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 

使用虛擬數據幀似乎沒有最優雅雖然。

+0

那麼,您是否設法制作了自己的Python GNSS處理程序? – multigoodverse

+0

我用IPython筆記本做了很多腳本,並不是一個程序說的。你可以在這裏找到我的想法(https://github.com/ruffsl/RTKLIB-Tools),但我在一段時間內沒有觸及它。 我看到你非常喜歡python和GIS,在去年出現了一些有前途的python GNSS工具,或許可以貢獻一下@ArditS。我看到[RTKLIB](https://github.com/tomojitakasu/RTKLIB/network)(儘管一個C項目)相當活躍。 – ruffsl

1

我建議編寫自定義解析器,逐行讀取文件中的行。

「G 5」之間的空間是編寫自定義分析程序的進一步提示。
在這種情況下,您不能簡單地通過空格拆分參數,您必須一次讀取所有3個字符,並刪除第一個字符,並將其餘兩個(「5」)轉換爲星座號。

+0

當我循環遍歷文件時,當遇到新的衛星ID時,將新的列添加到數據框的方式是什麼?我對na值很好。 – ruffsl

+0

我會使用SAT升序排序的列表,也許是一個treeMap(在java中),用鍵(Sat Id,value = atts的其餘部分)。也許每個GPS衛星系統(是第一個字母「G」和「S」)是一個自己的列表或樹。 – AlexWien