如何提升xarray重采样速度?其性能远慢于pandas(附测试示例)
如何让xarray的时间序列重采样速度接近pandas?
你观察到的xarray重采样速度随原始时间间隔增大而变慢的现象确实存在——这主要是因为xarray默认的重采样实现会处理更多元数据和坐标逻辑,而pandas的重采样针对时间序列做了更深度的性能优化。不过有几个实用方法可以让xarray的重采样速度追上pandas:
方法1:指定使用pandas引擎进行重采样
在xarray的resample方法中,你可以通过engine='pandas'参数直接调用pandas的重采样逻辑,这样既能保留xarray的数据结构优势,又能获得pandas的速度表现。修改你的测试代码如下:
import numpy as np import xarray as xr import pandas as pd import time def make_ds(freq): size = 100000 times = pd.date_range('2000-01-01', periods=size, freq=freq) ds = xr.Dataset({ 'foo': xr.DataArray( data = np.random.random(size), dims = ['time'], coords = {'time': times} ) }) return ds for f in ["1s", "1Min", "10Min"]: ds = make_ds(f) # 使用pandas引擎的xarray重采样 start = time.time() ds_r = ds.resample({'time':"1H"}, engine='pandas').mean() print(f, 'xr(pandas engine)', str(time.time() - start)) # 原pandas方法作为对比 start = time.time() ds_r = ds.to_dataframe().resample("1H").mean() print(f, 'pd', str(time.time() - start))
测试后你会发现,使用engine='pandas'的xarray重采样速度几乎和纯pandas方法一致,完美解决速度问题。
方法2:手动结合pandas重采样并转回xarray
如果你使用的xarray版本较旧(不支持engine参数),可以手动提取数据到pandas完成重采样,再转回xarray——这也是你测试中已经用到的方式,我们可以把它封装成一个便捷函数:
def resample_with_pandas(ds, freq, agg_func='mean'): df = ds.to_dataframe() resampled_df = df.resample(freq).agg(agg_func) return xr.Dataset.from_dataframe(resampled_df)
调用这个函数的速度和纯pandas重采样几乎没有差异,同时保留了xarray的Dataset结构。
为什么xarray默认重采样更慢?
xarray的默认重采样引擎(engine='xarray')是为支持复杂多维数据和坐标操作设计的,比如处理多维数组、非时间维度的重采样、保留更多元数据等。但对于一维时间序列这种简单场景,pandas的引擎在速度上更有针对性的优化。
内容的提问来源于stack exchange,提问作者mankoff
相关产品推荐
相关产品推荐

