我正在使用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文件,因此切换到熊猫是没有选择的。
[更新] 我最接近的是this answer;只要不使用Dask,该示例就可以在我的简单示例中使用,如果文件包含Dask数组,则会出现错误:
skipna = True的'last'尚未在dask数组上实现
但是我看不到可以/必须设置skipna
的地方。
答案 0 :(得分:5)
我认为xarray并没有自己的方法,但是以下方法可以实现
i = np.random.rand(100000)
j = np.random.rand(100000)
%timeit np.sqrt(i**2 + j**2)
# 1.45 ms ± 314 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit (i*i + j*j)**0.5
# 1.21 ms ± 78.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
答案 1 :(得分:1)
显然,stackoverflow不会让我发表评论...我想补充Keisuke的答案。您还可以使用get_index()
函数来获取熊猫索引。
f.sel(time=~f.get_index("time").duplicated())