使用Pandas读取GPS RINEX数据

时间:2013-08-02 15:43:09

标签: python python-3.x gps pandas

我正在阅读[RINEX-3.02](第60页)观察数据文件,以进行一些基于时间的卫星ID过滤,最终将重建它。通过RTK后处理,这将使我能够更好地控制卫星的选择,以便随着时间的推移为位置解决方案做出贡献。

特别是对于这部分,我只是使用:

  • [蟒-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的行标签?)。

我最初认为这可以被视为MultiIndex问题,
但是我不太确定pandas read_csv能做什么 Jump to Reading DataFrame objects with MultiIndex

有什么建议吗?

相关来源如果感兴趣:

2 个答案:

答案 0 :(得分:3)

这是我最终做的事情

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

请注意,我只是在构建后设置了新的MultiIndex。 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

使用虚拟数据框似乎并不是最优雅的。

答案 1 :(得分:1)

我建议编写自定义解析器,逐行读取文件。

“G 5”之间的空格是编写自定义解析器的进一步提示 在这种情况下,你不能简单地用空格分割参数,
你必须一次读取所有3个字符,并删除第一个字符,并将剩余的两个字符(“5”)转换为卫星号码。