2013-08-02 58 views
6

Tôi đang đọc tệp Dữ liệu Quan sát [RINEX-3.02] (trang 60) để thực hiện lọc ID vệ tinh dựa trên thời gian, và cuối cùng sẽ tạo lại nó. Điều này sẽ cho phép tôi kiểm soát nhiều hơn đối với việc lựa chọn các vệ tinh mà tôi cho phép đóng góp vào một giải pháp vị trí theo thời gian với xử lý bài RTK.Đọc dữ liệu GPS RINEX với Pandas

Cụ thể cho phần này mặc dù, tôi chỉ sử dụng:

  • [python-3.3]
  • [gấu trúc]
  • [NumPy]

Dưới đây là một mẫu với ba lần quan sát được đóng dấu đầu tiên.
Lưu ý: Không cần phân tích dữ liệu từ tiêu đề.

 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 

Nếu tôi phải thực hiện một phân tích cú pháp tùy chỉnh,
Điều khó khăn khác là ID vệ tinh đến và đi theo thời gian,
(như hình với vệ tinh "G 2" và "G 4")
(cộng với chúng cũng có khoảng trống trong các ID)
Vì vậy, khi tôi đọc chúng vào một DataFrame,
Tôi cần phải tạo nhãn cột mới (hoặc nhãn hàng cho MultiIndex?) Khi tôi tìm thấy chúng.

ban đầu tôi đã suy nghĩ điều này có thể được coi là một vấn đề MultiIndex,
nhưng tôi không như vậy chắc chắn gấu trúc read_csv có thể làm tất cả mọi thứ
Jump to Reading DataFrame objects with MultiIndex

Bất kỳ lời đề nghị?

nguồn có liên quan nếu quan tâm:

+0

bạn có thể thêm một vài dòng dữ liệu giả, khó để phỏng đoán không. :) –

+0

Rất tiếc, đã xảy ra lỗi trong định dạng và phải tiếp tục xuất bản để gỡ lỗi định dạng. – ruffsl

Trả lời

3

Dưới đây là những gì tôi đã kết thúc làm

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

Lưu ý rằng tôi chỉ cần thiết lập các MultiIndex mới ở cuối sau khi xây dựng nó. 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 

Sử dụng một hình nộm dữ liệu-frame chỉ dường như không phải là thanh lịch nhất mặc dù.

+0

Vì vậy, bạn đã quản lý để làm cho chương trình xử lý GNSS Python của riêng bạn? – multigoodverse

+0

Tôi đã làm rất nhiều kịch bản với máy tính xách tay IPython, không thực sự là một chương trình nói. Bạn có thể tìm thấy suy nghĩ của tôi [ở đây] (https://github.com/ruffsl/RTKLIB-Tools), nhưng tôi đã không chạm vào nó trong một thời gian. Tôi thấy bạn rất thích python và GIS, có bất kỳ công cụ GNSS trăn tiềm năng nào được cắt xén trong năm ngoái hoặc một người có thể đóng góp, @ArditS.? Tôi thấy [RTKLIB] (https://github.com/tomojitakasu/RTKLIB/network) (mặc dù một dự án C) đã khá tích cực. – ruffsl

1

Tôi đề nghị để viết một phân tích cú pháp tùy chỉnh, đọc những dòng tập tin bằng cách dòng.

Không gian inebtween "G 5" là một gợi ý khác để viết trình phân tích cú pháp tùy chỉnh.
Trong trường hợp đó, bạn không thể chia các đối số đơn giản theo không gian,
bạn phải đọc cả 3 ký tự cùng một lúc và loại bỏ char thứ nhất và chuyển đổi hai ký tự còn lại ("5") thành số sattelite.

+0

Khi tôi lặp qua tệp, cách nào để thêm cột mới vào khung dữ liệu khi tôi gặp phải một ID vệ tinh mới? Tôi ổn với giá trị na. – ruffsl

+0

Tôi sẽ sử dụng một danh sách được sắp xếp tăng dần bởi SAT nó, có thể là một treeMap (trong java), với khóa (Sat Id, giá trị = phần còn lại của atts). Có thể cho mỗi hệ thống GPS Sat (Có phải là chữ cái đầu tiên "G" và "S") một danh sách hoặc cây riêng. – AlexWien