xarray学习(一)Data Structures


最近需要处理一些大气数据集,有些数据集来自于卫星数据,文件格式很复杂。数据量也很庞大,一起负责项目的同学推荐了xarray库,学习一下以便更有效得整理和利用数据集。

所有内容的学习都是基于xarray提供的官方文档,计划过一遍User Guide。全英对自己来说还是有些困难,因此利用博客将自己学习中的想法记录下来。不得不说越学习越觉得官方文档真的是学习了解的第一手资料,也感受到自身英语方面的局限性。

数据结构

官方文档

介绍了xarray中两种基本的数据结构,DataArray和Dataset

在理解两种数据结构的同时,coordinate(坐标?)也是该库中一个重要概念。

DataArray

打开或创建
DataArray的构造函数

参数

  1. data:一个多维的值数组(numpy ndarray, Series, DataFrame或pandas.Panel)
  2. coords:坐标的列表或字典 (坐标名,具体数值)
  3. dims:一个维度名称列表,如果coords直接放入的list没有名字,则会用dims提供的名字
  4. attrs:要添加到实例的属性字典
  5. name:为实例起的名字

eg:

# 一个shape为[4,3]的多维数据组
data = np.random.rand(4, 3)
# 两个维度值列表
locs = ["IA", "IL", "IN"]
times = pd.date_range("2000-01-01", periods=4)

# dims 为两个维度定义了名字
# 构造DataArray
foo = xr.DataArray(data, coords=[times, locs], dims=["time", "space"])

输出:
在这里插入图片描述

Coordinates的指定方式
  1. 长度等于维数的值的列表(例如上面例子所示,coors是一个len==2的list,dims的len==2)
    列表中每个值必须为一下格式之一:
    • DataArray or Variable
    • (dims,data[,attrs]) 形式的元组:coords=[(“time”, times), (“space”, locs)])
    • 可以转换成DataArray的pandas对象或者标量值(例子中的times)
    • 一维数组或列表(如例子所示,普通list就可以)
  2. dictionary,字典的形式,此时dims必须有指定值才可以
    {coord_name: coord}
    foo = xr.DataArray(data,coords={
    		"time": times, 
    		"space": locs, 
    		"const": 42,
    		"ranking": ("space", [1, 2, 3]),
    		},
    dims=["time", "ranking"])
    
    输出:
    在这里插入图片描述
  3. 利用pandas的数据类型构造DataArray的时候,没有指定的参数会根据pandas进行自动对应
    eg:
    pandas 格式为:
    	df = pd.DataFrame(
    	{"x": [0, 1], 
    	 "y": [2, 3]}, 
      index=["a", "b"]
    )
    df.index.name = "abc"
    df.columns.name = "xyz"
    
    在这里插入图片描述
    转换成DataArray:
    在这里插入图片描述

构造参数中必要的只有data,其他的参数都有一定的默认值,只提供data将根据默认值自动创建。
使用字典的形式指定coords时,此时dims必须有指定值才可以

key properties 关键属性
  1. values: 该dataArray中实际的数值内容,tuple类型
  2. dims: 每个轴的维度名称,tuple类型
  3. coords:
  4. attrs:字典保存任意元数据
DataArray Coordinates

一种类似于字典dict的数据结构,保存数据一些轴的信息,注意,Coordinates中value部分的数据类型也是DataArray

  1. 访问
# coords中利用名称索引
foo.coords['times']
# 直接通过DataArray来访问
foo['times']
# 两种方式都可以
  1. 删除,del
# 删除
del foo['ranking']

DataSet

是一个类似字典的容器,包含有标记的数组(DataArray对象),其维度是对齐的。
类似于pandas中的DataFrame

创建或打开Dataset
DataArray的构造函数

构造实例:

	temp = 15 + 8 * np.random.randn(2,2, 3)
	precip = 10 * np.random.rand(2,2, 3)
	# coords
	lon = [[-99.83, -99.32], [-99.79, -99.23]]
	lat = [[42.25, 42.21], [42.63, 42.59]]
	
	ds = xr.Dataset(
	    data_vars = {
	       "temperature": (["x", "y", "time"], temp),
	       "precipitation": (["x", "y", "time"], precip),
	    },
	    coords={
	        "lon": (["x", "y"], lon),
	        "lat": (["x", "y"], lat),
	        "time": pd.date_range("2014-09-06", periods=3),
	        "reference_time": pd.Timestamp("2014-09-05"),
	    },
	)

输出结果:
在这里插入图片描述

构造函数的参数:

  • data_vars: 是一个字典,key是变量的名称,value是DataArray,或者能转换成dataArray的
  • coords:是一个与数据变量形式相同的字典。
  • attrs:一个字典

上述例子转换成pandas为:
在这里插入图片描述
通过此我们可以理解为,coordinate保存的是所有的轴的信息以及其具体数据(lat,lon,times),真实数据在这些轴上产生,而dims信息则是上述轴的索引,借dims我们可以在coordinates数据中,定位到具体的轴的信息。
比如dim组成为 (x,y,time) = (0,0,2014-09-06),对应的coordinates中的数据应该为

  • lon取(x,y)的值 -> lon.values[0][0] = -99.83, lat同样
  • time取(time)-> 2014-09-06
其他方式
  • 从pandas.DataFrame创建(Dataset.from_dataframe)
  • 从netCDF中创建(open_dataset())
Dataset contents
  1. 获取不同变量,返回DataArray类型
	ds["temperature"]
	ds.temperature
  1. 获取不同属性
	# 数据属性
	ds.data_vars
	# 坐标属性
	ds.coords
	# 元数据属性
	ds.attrs
类似于dict的操作方法

对于dataset的某些操作,可以类似于操作python字典一样进行操作

更新dataset
	# 实例化空dataset
	ds = xr.Dataset()
	# 为dataset的data_vars赋值
	ds["temperature"] = (("x", "y", "time"), temp)
	ds["temperature_double"] = (("x", "y", "time"), temp * 2)
	ds["precipitation"] = (("x", "y", "time"), precip)
	# 为coords赋值
	ds.coords["lat"] = (("x", "y"), lat)
	ds.coords["lon"] = (("x", "y"), lon)
	ds.coords["time"] = pd.date_range("2014-09-06", periods=3)
	ds.coords["reference_time"] = pd.Timestamp("2014-09-05")
其他

可以使用所有的标准dict方法

  • values
  • items
  • delitem
  • get
  • 浅拷贝 .copy() ; 深拷贝 .copy(deep=True)
类似于其他object的操作方法

xarray中还可以通过其他object方法(如pandas)等来操作Dataset

对于删除
  • drop_vars() 删除数据变量,会将删除的数据变量作为返回对象
  • drop_dims() 删除维度变量,使用该维度的变量都会被删除
对于更新
  • assign(),用于操作、生成新的数据变量,并将新的数据变量作为返回值
ds.assign(temperature2=2 * ds.temperature)
  • assign_coords(),用于操作、生成新的坐标,并将新的坐标变量作为返回值
  • pipe(),操作数据的方法
修改变量名字
  • 修改数据变量名,rename()
# 字典格式:key:old_name,value"new_name
ds.rename({"temperature": "temp", "precipitation": "precip"})
  • 修改dim维度索引变量名,swap_dims()
ds.coords["day"] = ("time", [6, 7, 8])
# 此时应该有两个坐标变量使用time作为其dim的索引变量,time和day
# 字典格式:key:old_name,value"new_name
ds.swap_dims({"time": "day"})

在这里插入图片描述
索引为time的地方都修改了

Coordinates(未完)

坐标变量,用于辅助DataArray和Dataset存储数据

types
  • dimension coordinates 维坐标

pandas.index

  • non-dimension coordinates 非维坐标

是包含坐标数据但不是维度坐标的变量。

坐标方法
  • ds.coords.to_dataset()

将coords转为dataset格式,coords在新的dataset中还是坐标变量

  • coords.merge
  • to_index()

将坐标(或任何DataArray)转换为实际的pandas.Index

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值