python xarray:将数据变量与离散观测值组合在一个新的连续维中

eqoofvh9  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(139)

我正在使用一个作物日历,它记录了一年中某个特定物候状态发生的日期(doy)--这里是平均播种季节(plant)和收获季节(harvest)(注意,下面打印的nan是海洋上的像素,其他值包含int):

<xarray.Dataset>
Dimensions:  (y: 2160, x: 4320)
Coordinates:
  * x        (x) float64 -180.0 -179.9 -179.8 -179.7 ... 179.7 179.8 179.9 180.0
  * y        (y) float64 89.96 89.88 89.79 89.71 ... -89.71 -89.79 -89.88 -89.96
Data variables:
    plant    (y, x) float32 nan nan nan nan nan nan ... nan nan nan nan nan nan
    harvest  (y, x) float32 nan nan nan nan nan nan ... nan nan nan nan nan nan

我需要将这两个变量合并到一个维度为(doy:365,年:2160,月:4320),以便跟踪每个像素的物候状态作为doy的函数。从概念上讲,我到目前为止确定的步骤是:
1.为每个状态分配一个数值,例如off=0plant=1harvest=2
1.使用doy作为新数据阵列的doy维度中的对应日的索引,并分配对应于该状态的数值
1.使用类似于pandas.DataFrame.fillnamethod='ffill'的方法完成中间的值
我浏览了Reshaping and reorganizing dataCombining Data页面,但就我目前对xarray的理解而言,我真的不知道从哪里开始。
有谁能给我指出一个方向吗?我正在尝试做的事情仅仅使用矩阵运算就可以实现吗?或者我必须引入循环吗?
PS:为问题本身令人困惑的表述道歉。我想这只反映了我仍然遗漏的一些基本内容。

dgjrabp2

dgjrabp21#

您可以利用xarray的自动广播规则来创建一个布尔掩码,其中包含所有高于/低于由x/y索引的日期数组的日期:

# I'm assuming your "day of year" values are 1-indexed, and you're
# using a 365-day calendar. I'll leave leap year handling to you :)
days_of_year = xr.DataArray(
    np.arange(1, 366), dims=["day_of_year"], coords=[np.arange(1, 366)],
)

# broadcast against eachother with (x, y) <= (day_of_year, )
planted = ds.plant <= days_of_year
harvested = ds.harvest <= days_of_year

state = planted + harvested

结果将是一个维数为(x, y, day_of_year)的数组,其中包含您描述的代码。

  • 关于生长季节数据的说明:*

我以前处理过这种类型的数据,需要注意的是全球范围内生长季节跨越1月1日的区域,这将打破上述方法。或者,您可以创建一个“is_growing_season”掩码,灵活处理生长季节跨越日历年的区域:

is_growing_season = xr.where(
    ds.harvest >= ds.plant,
    ((days_of_year >= ds.plant) & (days_of_year <= ds.harvest)),
    ((days_of_year >= ds.plant) | (days_of_year <= ds.harvest)),
)

相关问题