当前位置: 首页 > 知识库问答 >
问题:

在xray中删除重复的时间

夏侯阳
2023-03-14

我正在使用open\mfdataset读取NetCDF文件,其中包含重复的时间。对于每一次重复,我只想保留第一次,而放弃第二次(它将永远不会出现得更频繁)。这个问题与这个熊猫问题非常相似,但这里提供的解决方案似乎都不适用于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'])

生成的数据集中的时间为:

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文件,所以切换到熊猫是没有选择的。

[更新]我得到的最接近的答案是下面这个答案;这适用于我的简单例子,只要不使用Dask,如果文件包含Dask数组,我会得到错误:

与skipna=True的'最后'尚未在dask阵列上实现

但是我不知道我可以/必须在哪里设置skipna


共有2个答案

锺离锦
2023-03-14

显然Stackoverflow不让我发表评论...我想补充圭佑的回答。您还可以使用get_index()函数来获取熊猫索引。

f.sel(time=~f.get_index("time").duplicated())
时宾实
2023-03-14

我认为xray没有自己的方法来达到这个目的,但是下面的作品,

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,)>
 类似资料:
  • 问题内容: 我有一个包含以下字段的表: 现在,我需要删除具有same的行。一种方法是使用以下SQL以及脚本( ): 运行此查询后,我可以使用服务器端脚本删除重复项。 但是,我想知道是否只能使用SQL查询来完成。 问题答案: 一种简单的方法是在3列上添加索引。在编写语句时,请包含关键字。像这样: 这将删除所有重复的行。作为一项额外的好处,重复的将来会出错。和往常一样,您可能需要在运行类似内容之前进行

  • 问题内容: 我有这样的桌子 我想执行一个查询,以除去所有最新的重复项。我希望你有个主意吗? 例如,查询后的表必须是这样的 问题答案: 语法可能需要调整,但是应该做到这一点。此外,您可能希望将子查询预查询到其自己的表FIRST中,然后对该结果集运行DELETE FROM。

  • 我想通过聚合pyspark数据帧来分组,同时基于此数据帧的另一列删除重复项(保留最后一个值)。 总之,我想将dropDuplicates应用于GroupeData对象。所以,对于每个组,我只能动态地保留一行。 对于下面的数据帧,直接的组聚合是: 导致以下数据帧: 我希望聚合只使用每个的最新状态。在这种情况下,已在更新为,因此当时,所有基本时间戳大于的聚合应仅对列功能使用此状态。预期的聚合数据帧是:

  • 问题内容: 我有一个表,该表由id(key),符号,方向,范围,价格,百分比列组成。我想删除符号,方向,价格和百分比相同且范围最小的数据。我将如何完成? 我一直在尝试改变这种说法:使某些东西起作用。 问题答案: 这是 aw 表的样本数据。根据您的描述,我认为您想丢弃值分别为2、3和5的行。 确定的每个组合的最小范围值,,,和。 qryMinRanges : …给出以下结果集: 确定这些最小范围中的

  • 请注意,在转向您之前,我已经浏览了各种帖子。事实上,我尝试实现中提供的解决方案:基于“notin”条件从数据帧中删除行 我的问题如下。让我们假设我有一个巨大的数据帧,我想删除重复的数据帧。我很清楚我可以使用drop_duplicates,因为这是最快的最简单的方法。然而,我们的老师希望我们创建一个包含重复项ID的列表,然后根据这些值是否包含在上述列表中删除它们。 现在,让我们看看输出: 因此,我得

  • 问题内容: 我在存储的过程中有一个字符串,类似于或 从上面的字符串中,我必须从中删除多个逗号,它必须看起来像 或仅在 then时 。我必须仅使用Sql Server函数。我正在使用Sql Server 2008和.Net 3.5 提前致谢。 问题答案: 该选项适用于仅使用逗号或最多398个连续逗号的字符串。 如果需要更多,在顶部添加额外的2的幂,或者如果需要较少,则从顶部删除2的幂。每个阶段的注释