xarray:替换日期时间中与特定日期对应的数组值

时间:2019-02-22 16:50:54

标签: datetime python-datetime python-xarray

我有一个零示例数组:

time = np.arange('2000', '2005', dtype='datetime64[D]')
test_array = xr.DataArray(np.zeros(len(time)), coords={'time': time}, dims=['time'])

现在,如果我有一些数据,例如我想将test_data = np.ones(365)放入与年份2001(具有365天)相对应的数组中,该如何进行呢?

我想做类似的事情:test_array[test_array.where(time='2001')] = test_data,但是.where()在这里不起作用。

2 个答案:

答案 0 :(得分:0)

以下解决方案有效,但如果有更优雅的方法,我想知道。

ind_start = (test_array.indexes['time'] == pd.Timestamp('2001-01-01')).argmax()
ind_end = (test_array.indexes['time'] == pd.Timestamp('2001-12-31')).argmax()
test_array[ind_start:ind_end + 1] = test_data

答案 1 :(得分:0)

三个参数的xarray.where函数可能是一个更优雅的选择:

import pandas as pd
import xarray as xr

times = pd.date_range('2000', '2002')
da = xr.DataArray(range(len(times)), [('time', times)])
result = xr.where(da.time.dt.year == 2001, 1, da)

它也适用于值数组:

ones = xr.ones_like(da)
result = xr.where(da.time.dt.year == 2001, ones, da)

如果您是从纯NumPy数组开始的,则需要将其强制转换为DataArray,并确保其时间坐标与da的时间坐标完全对齐;如果NumPy数组的初始长度与da的初始长度不同,则需要添加一个重新索引步骤。这是一种方法:

import numpy as np

year_2001_times = da.time.sel(time=da.time.dt.year == 2001)
arr = np.random.random(len(year_2001_times))

random_da = xr.DataArray(arr, [('time', year_2001_times)])
reindexed_random_da = random_da.reindex_like(da)

result = xr.where(da.time.dt.year == 2001, reindexed_random_da, da)