首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Pandas读取GPS RINEX数据

用Pandas读取GPS RINEX数据
EN

Stack Overflow用户
提问于 2013-08-02 15:43:09
回答 2查看 4.9K关注 0票数 6

我正在读取一个RINEX-3.02观测数据文件来进行一些基于时间的卫星ID过滤,并将最终重建它。这将使我对卫星的选择有更多的控制权,随着时间的推移,我允许对RTK后处理的位置解决方案作出贡献。

但是,对于这个部分,我只是使用:

  • python-3.3
  • 熊猫
  • numpy

下面是一个样本,上面有三个时间戳的观测结果。

注意:我没有必要解析来自标头的数据。

代码语言:javascript
复制
     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  

如果我真的要做一个自定义解析器,

另一件棘手的事是卫星身份证来来去去,

(如卫星“G2”和“G4”所示)

(另外,他们在ID中也有空格)

所以当我把它们读入DataFrame时,

我需要制作新的列标签(还是MultiIndex的行标签?)当我找到他们的时候。

我一开始以为这是一个MultiIndex问题,

但我不太确定熊猫read_csv能做什么

跳转到用DataFrame读取MultiIndex对象

有什么建议吗?

有关消息来源如有兴趣:

  • Python3.3:http://www.python.org/download/releases/3.3.0/
  • numpy:http://www.numpy.org/
  • 熊猫:http://pandas.pydata.org/
  • RINEX-3.02:http://igscb.jpl.nasa.gov/igscb/data/format/rinex302.pdf
  • 爱姆姆:https://pypi.python.org/pypi/ephem/
  • RTKLIB:http://www.rtklib.com/
  • NOAA CORS:http://geodesy.noaa.gov/CORS/
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-02 23:48:28

以下是我最后所做的

代码语言:javascript
复制
df = readObs(indir, filename)
df.set_index(['%_GPST', 'satID'])

注意,我只是在构建完之后设置了新的MultiIndex。

代码语言:javascript
复制
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

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

票数 3
EN

Stack Overflow用户

发布于 2013-08-02 17:08:40

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

“G5”之间的空格是编写自定义解析器的进一步提示。

在这种情况下,你不能简单地用空格来分割参数,

您必须同时读取所有三个字符,并删除第一个字符,并将其余两个字符(“5")转换为一个卫星数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18021056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档