在xarray中删除重复的时间

时间:2018-06-27 08:47:10

标签: netcdf python-xarray

我正在使用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的地方。

2 个答案:

答案 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())