Hello 大家好,今天和大家讲一讲如何使用Python计算多年份,多文件的月平均值。
本次数据由Fans亲情提供,数据大致状况如下:
每一年一个独立的NC文件,并且每个文件中为十二个月
然后,就想要将这些文件批量计算为多年的月平均值。
示例数据下载:
https://wwff.lanzoum.com/b04q17f4d
密码:hi5a
我在这里有两个想法:
库引用
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') # 输出文件路径,修改成自己的路径