多NC文件,多年份计算月平均值

您所在的位置:网站首页 excel怎样提取年份 多NC文件,多年份计算月平均值

多NC文件,多年份计算月平均值

2023-06-17 04:36| 来源: 网络整理| 查看: 265

文章目录 前言数据介绍思路&想法代码完整代码

前言

Hello 大家好,今天和大家讲一讲如何使用Python计算多年份,多文件的月平均值。

数据介绍

本次数据由Fans亲情提供,数据大致状况如下: 在这里插入图片描述 每一年一个独立的NC文件,并且每个文件中为十二个月 在这里插入图片描述 然后,就想要将这些文件批量计算为多年的月平均值。

示例数据下载:

https://wwff.lanzoum.com/b04q17f4d 密码:hi5a

思路&想法

我在这里有两个想法:

直接将所有的NC文件进行拼接整合,然后一行代码直接计算多年平均值,但是这样会带来一个直接问题,如果所需要计算的NC文件过大,那么整合起来的NC文件会容量会原地爆炸的,在计算过程中就有可能会炸内存等。第二个就是嵌套两层循环,第一层循环是1-12月循环,第二层循环为文件循环,这样也会有一个问题执行效率偏低,但是胜在不会炸内存,本次我主要将这种方式。不要问我为啥不用第一个,我在自己处理数据的时候经常炸内存!!!! 代码

库引用

import xarray as xr import os import numpy as np import pandas as pd

文件路径配置

path = r'F:\CSDN\2023.6.11\nc_files/' # 文件夹路径,修改成自己的路径,这里面只能有待合成的NC,我没写文件过滤!! file_list = os.listdir(path) # 正序排序 file_list.sort() file_list

计算平均值

file_list = [path + i for i in file_list] # 合成文件路径 out_nc = xr.Dataset() # 创建一个空的Dataset avg_array = [] avg_month = [] month = '2016-' # 自定义的输出文件时间(年份),修改成自己的时间 for j in range(1,13): current_month_array = [] for i in range(len(file_list)): f = xr.open_dataset(file_list[i]) f = f.sel(time = f['time.month'] == j) lat = f['latitude'].values lon = f['longitude'].values fdir = f['fdir'].values # 第一纬度为1,去掉 # fdir = fdir[0] # 这一句用用来剔除多余纬度的!!,默认是注释掉的,请大家根据实际情况选择 current_month_array.append(fdir) f.close() # 关闭文件,释放内存 avg_month.append(pd.to_datetime(month + str(j))) current_month_array = np.array(current_month_array) avg_array.append(np.mean(current_month_array, axis = 0)) avg_array = np.array(avg_array) # print(avg_array.shape) out_nc['fdir'] = (('time','latitude','longitude'), np.array(avg_array)) # 输出文件的变量名,修改成自己的变量名 out_nc['time'] = (('time'), np.array(avg_month)) out_nc['latitude'] = (('latitude'), lat) out_nc['longitude'] = (('longitude'), lon) out_nc['fdir'].attrs['units'] = 'J m**-2' # 修改成自己的单位 out_nc['latitude'].attrs['units'] = 'degrees_north' # 配置lat的单位 out_nc['longitude'].attrs['units'] = 'degrees_east' # 配置lon的单位 out_nc.to_netcdf(r'F:\CSDN\2023.6.11\avg_fdir.nc') # 输出文件路径,修改成自己的路径 完整代码 import xarray as xr import os import numpy as np import pandas as pd path = r'F:\CSDN\2023.6.11\nc_files/' # 文件夹路径,修改成自己的路径 file_list = os.listdir(path) # 正序排序 file_list.sort() file_list file_list = [path + i for i in file_list] out_nc = xr.Dataset() avg_array = [] avg_month = [] month = '2016-' # 自定义的输出文件时间(年份),修改成自己的时间 for j in range(1,13): current_month_array = [] for i in range(len(file_list)): f = xr.open_dataset(file_list[i]) f = f.sel(time = f['time.month'] == j) lat = f['latitude'].values lon = f['longitude'].values fdir = f['fdir'].values # 第一纬度为1,去掉 fdir = fdir[0] current_month_array.append(fdir) f.close() avg_month.append(pd.to_datetime(month + str(j))) current_month_array = np.array(current_month_array) avg_array.append(np.mean(current_month_array, axis = 0)) avg_array = np.array(avg_array) # print(avg_array.shape) out_nc['fdir'] = (('time','latitude','longitude'), np.array(avg_array)) # 输出文件的变量名,修改成自己的变量名 out_nc['time'] = (('time'), np.array(avg_month)) out_nc['latitude'] = (('latitude'), lat) out_nc['longitude'] = (('longitude'), lon) out_nc['fdir'].attrs['units'] = 'J m**-2' # 修改成自己的单位 out_nc['latitude'].attrs['units'] = 'degrees_north' out_nc['longitude'].attrs['units'] = 'degrees_east' out_nc.to_netcdf(r'F:\CSDN\2023.6.11\avg_fdir.nc') # 输出文件路径,修改成自己的路径


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3