首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向xarray中的变量添加维度/坐标

向xarray中的变量添加维度/坐标
EN

Stack Overflow用户
提问于 2022-10-02 21:06:39
回答 1查看 88关注 0票数 1

我正在将Excel文件转换为xarray,并且在为变量分配维度时遇到了困难。

当从Pandas dataframe转换到xarray时,我的结果如下所示:

代码语言:javascript
运行
复制
<xarray.Dataset>
Dimensions:  (index: 10160)
Coordinates:
  * index    (index) int64 0123... 10156 10157 10158 10159
Data variables:
    DATE      (index) datetime64[ns] 2003-08-21 2003-08-21 ... 2021-08-14
    TIME      (index) object  2315 2315 316 ... 1816 1949 1949
    LATITUDE  (index) float64 64.07 64.07 64.07 ... 65.64 65.64
    LONGITUDE (index) float64 -164.6-164.6 .... -168.3 -168.3
    salinity  (index) float64 float64 nan nan nan ... 31.83 30.48 30.49
    temp      (index) float64 nan nan nan ... 2.474 9.171 9.092

要将一些数据变量转换为坐标,我使用以下代码:

代码语言:javascript
运行
复制
ds
 .assign_coords({"index": ds.TIME.values})
 .assign_coords({"date": ds.DATE.values})
 .assign_coords({"longitude": ds.LONGITUDE.values})
 .assign_coords({"latitude": ds.LATITUDE.values})
 .drop("TIME")
 .drop("DATE")
 .drop("LONGITUDE")
 .drop("LATITUDE")
 .rename_dims({"index":"time"})      
 .rename({"index":"time"})           
)

这解决了一些问题,方法是将时间、日期、lat和Lon作为维度和坐标,并将任意索引更改为time:

代码语言:javascript
运行
复制
<xarray.Dataset>
Dimensions:  (time: 10160, date: 10160, longitude: 10160, latitude: 10160)
Coordinates:
   time    (time) object 2315 2315 316 ... 1816 1949 1949
   date    (date) datetime64[ns] 2003-08-21 2003-08-21 ... 2021-08-14
   longitude (longitude) float64 -164.6-164.6 .... -168.3 -168.3
   latitude (latitude) float64 64.07 64.07 64.07 ... 65.64 65.64
Data variables:
    salinity  (time) float64 float64 nan nan nan ... 31.83 30.48 30.49
    temp      (time) float64 nan nan nan ... 2.474 9.171 9.092

我试图解决这一问题的一种方法是使用变量应该关联的4个维度形成一个多索引:

代码语言:javascript
运行
复制
midx = pd.MultiIndex.from_arrays([ds.LATITUDE.values, ds.LONGITUDE.values, ds.TIME.values, ds.DATE.values], names = ['latitude','longitude','time','date'])
ds['midx'] = midx

ds
 .assign_coords({"index": ds.midx.values})
 .assign_coords({"time": ds.TIME.values})
 .assign_coords({"date": bns_xr.DATE.values})
 .assign_coords({"longitude": bns_xr.LONGITUDE.values})
 .assign_coords({"latitude": bns_xr.LATITUDE.values})
 .drop("TIME")
 .drop("DATE")
 .drop("LONGITUDE")
 .drop("LATITUDE")  
 .drop("midx")
 .rename_dims({"index":"midx"})      
 .rename({"index":"midx"})   

然而,这导致变量是在midx的维度,而不是有4个期望的维度。如何将维度与变量如:盐度(纬度、经度、时间、日期)联系起来?

EN

回答 1

Stack Overflow用户

发布于 2022-10-03 01:39:20

一旦将多个索引指定为维度,就可以使用xr.Dataset.unstack将其解压。

代码语言:javascript
运行
复制
unstacked = ds.unstack("midx")

但是,我希望日期和时间不是相互垂直的,而是应该存在于数组中的日期时间维度的信息。如果您的数据应该是3D的,那么请确保只包括在multiindex中索引数据的三个dims。

或者,可以通过将正确的指数设置为熊猫数据的多个索引,然后再转换为xarray来实现这一点:

代码语言:javascript
运行
复制
df.set_index(["time", "latitude", "longitude"]).to_xarray()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73929361

复制
相关文章

相似问题

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