xarray выберите только те временные шаги, которые являются первыми месяца - PullRequest
1 голос
/ 23 октября 2019

Я хочу выбрать только те временные шаги, в которых данные являются первыми за месяц. Причина в том, что для дат, которые не являются первым днем ​​месяца, все данные равны nan.

Создайте фиктивный набор данных:

times = [
    pd.to_datetime('2017-01-01'),
    pd.to_datetime('2017-01-31'),
    pd.to_datetime('2017-02-01'),
    pd.to_datetime('2017-02-02'),
    pd.to_datetime('2017-03-01'),
    pd.to_datetime('2017-03-29'),
    pd.to_datetime('2017-03-30'),
    pd.to_datetime('2017-04-01'),
]
data = np.ones((8, 3, 3))
data[[1, 3, 5, 6], :, :] = np.nan

lat = [0, 1, 2]
lon = [0, 1, 2]


ds = xr.Dataset(
    {'data': (['time', 'lat', 'lon'], data)},
    coords={
        'lon': lon,
        'lat': lat,
        'time': times,
    }
)

ds

Out[]:
<xarray.Dataset>
Dimensions:  (lat: 3, lon: 3, time: 8)
Coordinates:
  * lon      (lon) int64 0 1 2
  * lat      (lat) int64 0 1 2
  * time     (time) datetime64[ns] 2017-01-01 2017-01-31 ... 2017-04-01
Data variables:
    data     (time, lat, lon) float64 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0

В идеале я хочу вывод, который выбирает только [0, 2, 4, 7] проиндексированное время.

<xarray.Dataset>
Dimensions:  (lat: 3, lon: 3, time: 4)
Coordinates:
  * lon      (lon) int64 0 1 2
  * lat      (lat) int64 0 1 2
  * time     (time) datetime64[ns] 2017-01-01 2017-02-01 2017-03-01 2017-04-01
Data variables:
    data     (time, lat, lon) float64 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Использование where с drop=True - это подход, который работает, но, возможно, самый прямой способ сделать это - использовать sel в сочетании с логическим массивом данных:

ds.sel(time=ds.time.dt.day == 1)

<xarray.Dataset>
Dimensions:  (lat: 3, lon: 3, time: 4)
Coordinates:
  * lon      (lon) int64 0 1 2
  * lat      (lat) int64 0 1 2
  * time     (time) datetime64[ns] 2017-01-01 2017-02-01 2017-03-01 2017-04-01
Data variables:
    data     (time, lat, lon) float64 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0
0 голосов
/ 23 октября 2019

То, как я работал до сих пор, использует xarray .where() в сочетании с функциональностью подстановки времени в квадратных скобках:

ds.where(ds['time.day'] == 1, drop=True)


<xarray.Dataset>
Dimensions:  (lat: 3, lon: 3, time: 4)
Coordinates:
  * lon      (lon) int64 0 1 2
  * lat      (lat) int64 0 1 2
  * time     (time) datetime64[ns] 2017-01-01 2017-02-01 2017-03-01 2017-04-01
Data variables:
    data     (time, lat, lon) float64 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0
...