我有一个零示例数组:
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()
在这里不起作用。
答案 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)