所有内容的学习都是基于xarray提供的官方文档,计划过一遍User Guide。全英对自己来说还是有些困难,因此利用博客将自己学习中的想法记录下来。不得不说越学习越觉得官方文档真的是学习了解的第一手资料,也感受到自身英语方面的局限性。
官方文档
介绍了xarray中两种基本的数据结构,DataArray和Dataset
在理解两种数据结构的同时,coordinate(坐标?)也是该库中一个重要概念。
参数
- data:一个多维的值数组(numpy ndarray, Series, DataFrame或pandas.Panel)
- coords:坐标的列表或字典 (坐标名,具体数值)
- dims:一个维度名称列表,如果coords直接放入的list没有名字,则会用dims提供的名字
- attrs:要添加到实例的属性字典
- 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"])
foo = xr.DataArray(data,coords={
"time": times,
"space": locs,
"const": 42,
"ranking": ("space", [1, 2, 3]),
},
dims=["time", "ranking"])
输出: df = pd.DataFrame(
{"x": [0, 1],
"y": [2, 3]},
index=["a", "b"]
)
df.index.name = "abc"
df.columns.name = "xyz"
构造参数中必要的只有data,其他的参数都有一定的默认值,只提供data将根据默认值自动创建。
使用字典的形式指定coords时,此时dims必须有指定值才可以
一种类似于字典dict的数据结构,保存数据一些轴的信息,注意,Coordinates中value部分的数据类型也是DataArray
# coords中利用名称索引
foo.coords['times']
# 直接通过DataArray来访问
foo['times']
# 两种方式都可以
# 删除
del foo['ranking']
是一个类似字典的容器,包含有标记的数组(DataArray对象),其维度是对齐的。
类似于pandas中的DataFrame
构造实例:
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"),
},
)
构造函数的参数:
上述例子转换成pandas为:
通过此我们可以理解为,coordinate保存的是所有的轴的信息以及其具体数据(lat,lon,times),真实数据在这些轴上产生,而dims信息则是上述轴的索引,借dims我们可以在coordinates数据中,定位到具体的轴的信息。
比如dim组成为 (x,y,time) = (0,0,2014-09-06),对应的coordinates中的数据应该为
ds["temperature"]
ds.temperature
# 数据属性
ds.data_vars
# 坐标属性
ds.coords
# 元数据属性
ds.attrs
对于dataset的某些操作,可以类似于操作python字典一样进行操作
# 实例化空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方法
xarray中还可以通过其他object方法(如pandas)等来操作Dataset
ds.assign(temperature2=2 * ds.temperature)
# 字典格式:key:old_name,value"new_name
ds.rename({"temperature": "temp", "precipitation": "precip"})
ds.coords["day"] = ("time", [6, 7, 8])
# 此时应该有两个坐标变量使用time作为其dim的索引变量,time和day
# 字典格式:key:old_name,value"new_name
ds.swap_dims({"time": "day"})
坐标变量,用于辅助DataArray和Dataset存储数据
pandas.index
是包含坐标数据但不是维度坐标的变量。
将coords转为dataset格式,coords在新的dataset中还是坐标变量
将坐标(或任何DataArray)转换为实际的pandas.Index