【问题标题】:xarray: replace array values corresponding to particular dates in datetimexarray:替换日期时间中特定日期对应的数组值
【发布时间】:2019-07-16 19:41:28
【问题描述】:

我有一个零数组示例:

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() 在这里不起作用。

【问题讨论】:

    标签: datetime python-datetime python-xarray


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      三参数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)
      

      【讨论】:

      • 一般我怎么能用任何长度为 365(不一定是)arr 使用 result = xr.where(da.time.dt.year == 2001, arr, da) 的 numpy 数组来做到这一点?如果我在arr 是一个 365 长的 np 数组时尝试这样做,我会收到一个广播 ValueError。如果我需要手动将arr 转换为 xr 格式,我应该怎么做才能兼容?
      • 确实在这种情况下从纯 NumPy 数组开始有点麻烦;查看我的最新更新。你认为你能找到一种方法来生成长度为 365 的数组,这样它就已经用 2001 年的日期和DataArray 的形式适当地标记了?那么您只需要在将其传递给where 之前进行重新索引步骤。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2021-11-20
      相关资源
      最近更新 更多