Datacube Xarray 按时间排序和 select 数组

Datacube Xarray sort and select arrays by time

我有一个用 Xarray 打开的数据立方体,它有几个变量和一个时间向量(“mid_date”,维度 18206),格式为 datetime64.

变量是18206 x 334 x 333。 问题是时间向量根本没有排序,我想按升序(从旧到新)对它进行排序。同时,重组我的变量数组。

然后,我想在 2 个日期之间 select 变量的一部分(例如:“vy”)(这样我就可以只对一部分数据进行计算) . 我可以对日期向量进行排序,但不能对其他变量应用该排序。我该怎么做?

这里是数据集的信息:

<xarray.Dataset>
Dimensions:                    (mid_date: 18206, y: 334, x: 333)
Coordinates:
  * mid_date                   (mid_date) datetime64[ns] 2011-10-01T00:00:00....
  * x                          (x) float64 4.868e+05 4.871e+05 ... 5.665e+05
  * y                          (y) float64 6.696e+06 6.696e+06 ... 6.616e+06
Data variables: (12/43)
    UTM_Projection             object ...
    acquisition_img1           (mid_date) datetime64[ns] ...
    acquisition_img2           (mid_date) datetime64[ns] ...
    autoRIFT_software_version  (mid_date) float64 ...
    chip_size_height           (mid_date, y, x) float32 ...
    chip_size_width            (mid_date, y, x) float32 ...
                        ...
    vy                         (mid_date, y, x) float32 ...
    vy_error                   (mid_date) float32 ...
    vy_stable_shift            (mid_date) float64 ...
    vyp                        (mid_date, y, x) float64 ...
    vyp_error                  (mid_date) float64 ...
    vyp_stable_shift           (mid_date) float64 ...
Attributes:
    GDAL_AREA_OR_POINT:         Area
    author:                     ITS_LIVE, a NASA MEaSUREs project (its-live.j...
    datacube_software_version:  1.0
    date_created:               30-01-2021 20:49:16
    date_updated:               30-01-2021 20:49:16
    institution:                NASA Jet Propulsion Laboratory (JPL), Califor...
    projection:                 32607
    title:                      ITS_LIVE datacube of image_pair velocities

我试过了:

test = datacube.vy.sel(mid_date=slice("2010-01","2013-01"))

test = datacube.vy.sel(mid_date=slice(datetime.datetime("2010-01-01"),datetime.datetime("2013-01-01")))

test = datacube.vy.sel(mid_date=slice(np.datetime64(2010, 1, 1, 1, 1),np.datetime64(2013, 1, 1, 1, 1)))

但没有任何效果。

我看到两个可能的解决方案:

1/ 根据您想要的明确日期列表进行选择

import numpy as np
from datetime import datetime

da = datacube.vy

filter_dates = filter(lambda d: (d >= np.datetime64(datetime(2010, 1, 1))) & (d < np.datetime64(datetime(2013, 1, 1))),
                      da.mid_date.values)

the_dates_you_want = list(filter_dates)

da[da.mid_date.isin(the_dates_you_want)]

2/ 选择前重新索引

new_time = sorted(da.mid_date.values)
da = da.reindex(mid_date = new_time)
da.sel(mid_date = slice(datetime(2010, 1, 1), datetime(2013, 1, 1)))