gpt4 book ai didi

netcdf - 在XArray中删除重复的时间

转载 作者:行者123 更新时间:2023-12-03 15:10:34 27 4
gpt4 key购买 nike

我正在使用open_mfdataset读取NetCDF文件,其中包含重复的时间。对于每个重复的时间,我只想保留第一次出现的时间,然后丢弃第二次出现的时间(永远不会再出现)。这个问题与this Pandas question非常相似,但是那里提供的所有解决方案似乎都无法与Xarray一起使用。

重现该问题:

import numpy as np
import netCDF4 as nc4
import xarray as xr

# Create example NetCDF files
for t in range(2):
nc = nc4.Dataset('test{}.nc'.format(t), 'w')
dim_t = nc.createDimension('time', None)
var_t = nc.createVariable('time', 'f8', ('time',))
var_s = nc.createVariable('var', 'f8', ('time',))
var_t.setncattr('units', 'hours since 2001-01-01 00:00:00')
var_t[:] = t*5+np.arange(6)
var_s[:] = t*5+np.arange(6)+t
nc.close()

# Read with xarray
f = xr.open_mfdataset(['test0.nc', 'test1.nc'])

生成的 dataset中的时间为:
array(['2001-01-01T00:00:00.000000000', '2001-01-01T01:00:00.000000000',
'2001-01-01T02:00:00.000000000', '2001-01-01T03:00:00.000000000',
'2001-01-01T04:00:00.000000000', '2001-01-01T05:00:00.000000000',
'2001-01-01T05:00:00.000000000', '2001-01-01T06:00:00.000000000',
'2001-01-01T07:00:00.000000000', '2001-01-01T08:00:00.000000000',
'2001-01-01T09:00:00.000000000', '2001-01-01T10:00:00.000000000'], dtype='datetime64[ns]')

有没有一种简单的方法可以消除 2001-01-01T05:00:00.000000000的第二次出现?现实生活中的问题涉及多维NetCDF文件,因此切换到Pandas是没有选择的。

[更新] 我得到的最接近的是 this answer;只要不使用Dask就可以在我的简单示例中使用,如果文件包含Dask数组,则会出现错误:

'last' with skipna=True is not yet implemented on dask arrays



但是我看不到可以/必须在哪里设置 skipna

最佳答案

我认为xarray没有为此目的使用自己的方法,但以下工作原理可以解决此问题:

In [7]: _, index = np.unique(f['time'], return_index=True)

In [8]: index
Out[8]: array([ 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11])

In [9]: f.isel(time=index)
Out[9]:
<xarray.Dataset>
Dimensions: (time: 11)
Coordinates:
* time (time) datetime64[ns] 2001-01-01 2001-01-01T01:00:00 ...
Data variables:
var (time) float64 dask.array<shape=(11,), chunksize=(6,)>

关于netcdf - 在XArray中删除重复的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51058379/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com