首页 > 解决方案 > xArray: reindex_like(method='nearest') TypeError: 不支持的操作数类型 -: 'str' 和 'str'

问题描述

我有两个 xArray 数据数组,它们由 datetime64 索引并包含一个功能:一个包含单个字符串的列表。它们的长度不同,我想重新索引一个以匹配另一个的索引。但是,使用 'nearest' 填充方法调用 reindex_like 会在底层 Pandas reindex_like 函数中引发错误(TypeError: unsupported operand type(s) for -: 'str' and 'str')。这是完整的跟踪:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-100-a93735b2e55d> in <module>()
----> 1 b_dataarray.reindex_like(d_dataarray, method='nearest')

7 frames
/usr/local/lib/python3.7/dist-packages/xarray/core/dataarray.py in reindex_like(self, other, method, tolerance, copy, fill_value)
   1235             tolerance=tolerance,
   1236             copy=copy,
-> 1237             fill_value=fill_value,
   1238         )
   1239 

/usr/local/lib/python3.7/dist-packages/xarray/core/dataarray.py in reindex(self, indexers, method, tolerance, copy, fill_value, **indexers_kwargs)
   1298             tolerance=tolerance,
   1299             copy=copy,
-> 1300             fill_value=fill_value,
   1301         )
   1302         return self._from_temp_dataset(ds)

/usr/local/lib/python3.7/dist-packages/xarray/core/dataset.py in reindex(self, indexers, method, tolerance, copy, fill_value, **indexers_kwargs)
   2495             fill_value,
   2496             sparse=False,
-> 2497             **indexers_kwargs,
   2498         )
   2499 

/usr/local/lib/python3.7/dist-packages/xarray/core/dataset.py in _reindex(self, indexers, method, tolerance, copy, fill_value, sparse, **indexers_kwargs)
   2526             copy=copy,
   2527             fill_value=fill_value,
-> 2528             sparse=sparse,
   2529         )
   2530         coord_names = set(self._coord_names)

/usr/local/lib/python3.7/dist-packages/xarray/core/alignment.py in reindex_variables(variables, sizes, indexes, indexers, method, tolerance, copy, fill_value, sparse)
    550                 )
    551 
--> 552             int_indexer = get_indexer_nd(index, target, method, tolerance)
    553 
    554             # We uses negative values from get_indexer_nd to signify

/usr/local/lib/python3.7/dist-packages/xarray/core/indexing.py in get_indexer_nd(index, labels, method, tolerance)
    101     """
    102     flat_labels = np.ravel(labels)
--> 103     flat_indexer = index.get_indexer(flat_labels, method=method, tolerance=tolerance)
    104     indexer = flat_indexer.reshape(labels.shape)
    105     return indexer

/usr/local/lib/python3.7/dist-packages/pandas/core/indexes/base.py in get_indexer(self, target, method, limit, tolerance)
   2994             indexer = self._get_fill_indexer(target, method, limit, tolerance)
   2995         elif method == "nearest":
-> 2996             indexer = self._get_nearest_indexer(target, limit, tolerance)
   2997         else:
   2998             if tolerance is not None:

/usr/local/lib/python3.7/dist-packages/pandas/core/indexes/base.py in _get_nearest_indexer(self, target, limit, tolerance)
   3080 
   3081         target_values = target._values
-> 3082         left_distances = np.abs(self._values[left_indexer] - target_values)
   3083         right_distances = np.abs(self._values[right_indexer] - target_values)
   3084 

TypeError: unsupported operand type(s) for -: 'str' and 'str'

看起来它被抛出了 Pandas 确定要填充的最接近索引的位置。但是,我很困惑为什么当数据数组的索引是 datetime64 时它试图减去两个字符串。我做了仔细检查以确保两个数据数组的索引中没有错误的字符串,并且我可以确认它们都是 datetime64。也许 Pandas 错误地比较了数据数组的数据值而不是日期时间索引?

标签: pythonpandaspython-xarray

解决方案


我有一个非常相似的问题,老实说,我不确定如何解决它。我通过替换避免使用 reindex_like

ppg_df.reindex_like(ecg_df, method='nearest')

ppg_df.reindex(df2.index, method='nearest')

推荐阅读