You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:37:41