最近需要处理一些大气数据集,有些数据集来自于卫星数据,文件格式很复杂。数据量也很庞大,一起负责项目的同学推荐了xarray库,学习一下以便更有效得整理和利用数据集。
所有内容的学习都是基于xarray提供的官方文档,计划过一遍User Guide。全英对自己来说还是有些困难,因此利用博客将自己学习中的想法记录下来。不得不说越学习越觉得官方文档真的是学习了解的第一手资料,也感受到自身英语方面的局限性。
数据结构
官方文档
介绍了xarray中两种基本的数据结构,DataArray和Dataset
在理解两种数据结构的同时,coordinate(坐标?)也是该库中一个重要概念。
DataArray
打开或创建
DataArray的构造函数
参数
- data:一个多维的值数组(numpy ndarray, Series, DataFrame或pandas.Panel)
- coords:坐标的列表或字典 (坐标名,具体数值)
- dims:一个维度名称列表,如果coords直接放入的list没有名字,则会用dims提供的名字
- attrs:要添加到实例的属性字典
- name:为实例起的名字
eg:
data = np.random.rand(4, 3)
locs = ["IA", "IL", "IN"]
times = pd.date_range("2000-01-01", periods=4)
foo = xr.DataArray(data, coords=[times, locs], dims=["time", "space"])
输出:
Coordinates的指定方式
- 长度等于维数的值的列表(例如上面例子所示,coors是一个len==2的list,dims的len==2)
列表中每个值必须为一下格式之一:
- DataArray or Variable
- (dims,data[,attrs]) 形式的元组:coords=[(“time”, times), (“space”, locs)])
- 可以转换成DataArray的pandas对象或者标量值(例子中的times)
- 一维数组或列表(如例子所示,普通list就可以)
- dictionary,字典的形式,此时dims必须有指定值才可以
{coord_name: coord}foo = xr.DataArray(data,coords={
"time": times,
"space": locs,
"const": 42,
"ranking": ("space", [1, 2, 3]),
},
dims=["time", "ranking"])
输出: - 利用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 关键属性
- values: 该dataArray中实际的数值内容,tuple类型
- dims: 每个轴的维度名称,tuple类型
- coords:
- attrs:字典保存任意元数据
DataArray Coordinates
一种类似于字典dict的数据结构,保存数据一些轴的信息,注意,Coordinates中value部分的数据类型也是DataArray
- 访问
foo.coords['times']
foo['times']
- 删除,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)
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
- 获取不同变量,返回DataArray类型
ds["temperature"]
ds.temperature
- 获取不同属性
ds.data_vars
ds.coords
ds.attrs
类似于dict的操作方法
对于dataset的某些操作,可以类似于操作python字典一样进行操作
更新dataset
ds = xr.Dataset()
ds["temperature"] = (("x", "y", "time"), temp)
ds["temperature_double"] = (("x", "y", "time"), temp * 2)
ds["precipitation"] = (("x", "y", "time"), precip)
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(),操作数据的方法
修改变量名字
ds.rename({"temperature": "temp", "precipitation": "precip"})
ds.coords["day"] = ("time", [6, 7, 8])
ds.swap_dims({"time": "day"})
索引为time的地方都修改了
Coordinates(未完)
坐标变量,用于辅助DataArray和Dataset存储数据
types
- dimension coordinates 维坐标
pandas.index
- non-dimension coordinates 非维坐标
是包含坐标数据但不是维度坐标的变量。
坐标方法
将coords转为dataset格式,coords在新的dataset中还是坐标变量
将坐标(或任何DataArray)转换为实际的pandas.Index
|