首页 > 解决方案 > 如何从多个每日文件中获取运行平均值或移动平均值

问题描述

我有 11 年(2007 年到 2017 年)的每日温度档案。总共有11*365 = 4015NetCDF 文件。每个文件包含纬度(100,)、经度(360,)维度和这些大小的温度变量(360, 100)。我想在每个网格点找到 15 天的运行(移动)平均值,NaN如果存在则忽略这些值。这意味着需要使用 15 个文件来找到平均值。我有以下功能可以从文件夹中读取所有日常文件。例如,需要找到files_list[0:15], files_list[1:16],的平均值。并且每个文件都意味着需要保存为一个新的 NetCDF 文件。我有一个创建 NetCDF 文件的想法。但找不到运行或移动平均线。files_list[2:17]....files_list[4000:]

这是我的代码:

def files_list (working_dir, extension):
    '''
    input = working directory and extension of file(eg. *.nc)
    outout = returns the list of files in the folder
    '''
    file_full_path = os.path.join(working_dir)
    os.chdir(working_dir)
    files = glob.glob(os.path.join(file_full_path,extension)) 
    files = natsort.natsorted(files)
    files_list= []       #Empty lsit of files
    j = 0 
    for j in range(0,len(files)):
        files_list.append(os.path.basename(files[j])) #appending each files in a directory to file list 
    return files_list

标签: pythonnetcdfpython-xarray

解决方案


这不是 python 中的解决方案,但如果您的文件被称为 file_20061105.nc 等,您可以从命令行将它们与 cdo(气候数据运算符)合并,然后使用 runmean 函数

cdo mergetime file_*.nc merged_file.nc
cdo runmean,15 merged_file.nc runmean.nc

在某些系统上,您可以打开的文件数量有限制,在这种情况下,您可能需要先合并文件一年

for year in {2007..2017} ; do 
  cdo mergetime file_${year}????.nc merged_${year}.nc
done
cdo mergetime merged_????.nc merged_file.nc
cdo runmean,15 merged_file.nc runmean.nc

就像从命令行快速执行此操作的另一种方法一样。

如果您想在 python 程序中执行此任务,那么您可以先以这种方式将文件转换为一个文件(或在 python 中循环文件并将它们读入一个 100x360x4000 的单个 numpy 数组),然后执行运行意思是在python中,这里已经有一个关于这个任务的stackoverflow问题:

移动平均线或移动平均线


推荐阅读