XArray:从属性创建新的坐标/维度

XArray: Create a new coordinate / dimension from an attribute

我正在使用一个库 (georinex) 读取 GPS RINEX 数据和 returns 一个 xarray in return.

我在 return 中从一个 GPS 接收站解析 rinex 文件得到的典型数据是例如这个:

<xarray.Dataset>Users\eballes\Desktop\share6_day5_highrate[=10=]\abpo225a00.14n
Dimensions:           (sv: 12, time: 2)
Coordinates:
  * time              (time) datetime64[ns] 2014-08-13 2014-08-13T02:00:00
  * sv                (sv) <U3 'G01' 'G03' 'G07' 'G08' ... 'G27' 'G28' 'G32'
Data variables:
    SVclockBias       (time, sv) float64 nan nan nan ... 0.0003767 -0.0003641
    SVclockDrift      (time, sv) float64 nan nan nan ... 2.728e-12 8.413e-12
    SVclockDriftRate  (time, sv) float64 nan nan nan nan nan ... 0.0 0.0 0.0 0.0
    IODE              (time, sv) float64 nan nan nan nan ... 89.0 60.0 85.0 64.0
    Crs               (time, sv) float64 nan nan nan nan ... -29.56 100.2 78.56
    DeltaN            (time, sv) float64 nan nan nan ... 3.904e-09 5.106e-09
    M0                (time, sv) float64 nan nan nan nan ... 0.6369 1.585 -1.493
    Cuc               (time, sv) float64 nan nan nan ... 4.929e-06 4.02e-06
    Eccentricity      (time, sv) float64 nan nan nan ... 0.01919 0.01139
    Cus               (time, sv) float64 nan nan nan ... 9.466e-06 8.697e-06
    sqrtA             (time, sv) float64 nan nan nan ... 5.154e+03 5.154e+03
    Toe               (time, sv) float64 nan nan nan ... 2.664e+05 2.664e+05
    Cic               (time, sv) float64 nan nan nan ... -7.078e-08 -1.863e-08
    Omega0            (time, sv) float64 nan nan nan nan ... 2.154 1.175 -1.948
    Cis               (time, sv) float64 nan nan nan ... -4.619e-07 -1.434e-07
    Io                (time, sv) float64 nan nan nan ... 0.9641 0.9871 0.9473
    Crc               (time, sv) float64 nan nan nan nan ... 338.2 208.2 206.5
    omega             (time, sv) float64 nan nan nan ... 0.3215 -1.71 -0.1162
    OmegaDot          (time, sv) float64 nan nan nan ... -7.925e-09 -8.374e-09
    IDOT              (time, sv) float64 nan nan nan ... 5.997e-10 6.879e-10
    CodesL2           (time, sv) float64 nan nan nan nan nan ... 0.0 0.0 0.0 0.0
    GPSWeek           (time, sv) float64 nan nan nan ... 1.805e+03 1.805e+03
    L2Pflag           (time, sv) float64 nan nan nan nan nan ... 0.0 0.0 0.0 0.0
    SVacc             (time, sv) float64 nan nan nan nan nan ... 2.0 2.0 2.0 2.0
    health            (time, sv) float64 nan nan nan nan nan ... 0.0 0.0 0.0 0.0
    TGD               (time, sv) float64 nan nan nan ... -1.071e-08 -3.26e-09
    IODC              (time, sv) float64 nan nan nan nan ... 89.0 60.0 85.0 64.0
    TransTime         (time, sv) float64 nan nan nan ... 2.592e+05 2.592e+05
    FitIntvl          (time, sv) float64 nan nan nan nan nan ... 4.0 4.0 4.0 4.0
Attributes:
    version:    2.1
    svtype:     ['G']
    rinextype:  nav
    filename:   abpo225a00.14n

如您所见,坐标timesv。但是,对于我的特定问题,我需要将数据变量 TransTime 添加为 坐标

不幸的是,我无法使任何工作正常进行,而且我还没有找到任何可用于修改现有 xarray 结构的示例,因为我认为最正常的方法是直接使用正确的坐标。

到目前为止的代码很简单,在 uncompress 之后使用 this data it:

  import georinex as gr
  nav = gr.load('abpo225a00.14n')

在这一点上我应该nav转换成类似于:

的东西
<xarray.Dataset>Users\eballes\Desktop\share6_day5_highrate[=12=]\abpo225a00.14n
Dimensions:           (sv: 12, time: 2)
Coordinates:
  * time              (time) datetime64[ns] 2014-08-13 2014-08-13T02:00:00
  * sv                (sv) <U3 'G01' 'G03' 'G07' 'G08' ... 'G27' 'G28' 'G32'
  * TransTime         (TransTime) <values from TransTime variable>

尝试

nav = nav.assign_coords(TransTime=nav.TransTime])

从技术上讲,从我的问题来看, 答案是正确的。不幸的是,对于我无法正确表述的问题,不够

用接受的答案分配坐标时,生成的 Xarray 具有以下形状:

Coordinates:
  * time              (time) datetime64[ns] 2014-08-13 2014-08-13T02:00:00
  * sv                (sv) <U3 'G01' 'G03' 'G07' 'G08' ... 'G27' 'G28' 'G32'
    TransTime         (sv, time) <values from TransTime variable>

这不是我真正想要的(或者至少它对我没有用),因为新坐标依赖于其他两个索引并且本身没有索引。

我意识到我真正想要的不是新坐标而是索引的变化。最后真正实现这个目标的是进入 DataFrame 级别,删除当前索引,创建新索引并返回到 xarray

nav = gr.load(file_path).to_dataframe().dropna(how='all')
nav = nav.reset_index(['time', 'sv'])
nav = nav.set_index(['sv','TransTime'])
nav = nav.to_xarray()

我希望这对从 XArray/Pandas 开始遇到这个问题但不完全清楚自己想要什么的人有用。