import numpy as np
from netCDF4 import Dataset
from datetime import datetime
current_time = datetime.now()
formatted_time = current_time.strftime("%m-%d-%H-%M-%S")
def extend_list(lst, extension_count):
"""
扩展列表两端,增加指定数量的元素
:param lst: 原始列表
:param extension_count: 扩展的元素数量
:return: 扩展后的列表
"""
original_type = type(lst[0])
delta = lst[1] - lst[0]
left_extension = [original_type(lst[0] - delta * i) for i in range(1, extension_count + 1)]
left_extension.reverse()
right_extension = [original_type(lst[-1] + delta * i) for i in range(1, extension_count + 1)]
extended_lst = np.concatenate([left_extension, lst, right_extension])
return extended_lst
def copy_variable_attributes(src_var, dst_var):
"""
复制变量的所有属性并设置分块大小
:param src_var: 源变量
:param dst_var: 目标变量
"""
for attr_name in src_var.ncattrs():
if attr_name != '_FillValue':
dst_var.setncattr(attr_name, src_var.getncattr(attr_name))
def copy_polar_stereographic(src_nc, dst_nc):
"""
复制 polar_stereographic 变量及其属性
:param src_nc: 源 NetCDF 文件
:param dst_nc: 目标 NetCDF 文件
"""
polar_stereographic_src = src_nc.variables['polar_stereographic']
polar_stereographic_target = dst_nc.createVariable(
'polar_stereographic', polar_stereographic_src.datatype, polar_stereographic_src.dimensions
)
for attr in polar_stereographic_src.ncattrs():
polar_stereographic_target.setncattr(attr, polar_stereographic_src.getncattr(attr))
polar_stereographic_target[:] = polar_stereographic_src[:]
x_max = int(dst_nc.variables['x'][:][-1] + 3125)
y_yax = int(dst_nc.variables['y'][:][-1] + 3125)
polar_stereographic_target.GeoTransform = f'-{x_max} 6250 0 {y_yax} 0 -6250'
def apply_circle_mask_to_z(z):
"""
在二维数组 z 上应用圆形掩膜
:param z: 原始二维数据数组
:return: 更新后的 z 数组
"""
mask = z
center_x, center_y = z.shape[0] / 2, z.shape[1] / 2
if center_x > center_y:
radius = center_y
else:
radius = center_x
for i in range(z.shape[0]):
for j in range(z.shape[1]):
distance = np.sqrt((i - center_x) ** 2 + (j - center_y) ** 2)
if distance > radius:
mask[i, j] = np.nan
return mask
def create_and_save_nc(input_file_path, output_file_path, extension_count=100):
"""
扩展原始 NetCDF 数据并保存到新文件
:param input_file_path: 输入的 NetCDF 文件路径
:param output_file_path: 输出的 NetCDF 文件路径
:param extension_count: 要扩展的坐标数(默认扩展 100)
"""
with Dataset(input_file_path, mode='r') as nc_file:
x = nc_file.variables['x'][:]
y = nc_file.variables['y'][:]
z = nc_file.variables['z'][:]
x_size, y_size = x.shape[0], y.shape[0]
new_x = extend_list(x, extension_count)
new_y = extend_list(y, extension_count)
new_z = np.full((new_y.shape[0], new_x.shape[0]), np.ma.masked, dtype=np.float32)
new_z[extension_count:y_size + extension_count, extension_count:x_size + extension_count] = z
with Dataset(output_file_path, mode='w', format='NETCDF4') as new_nc_file:
new_nc_file.createDimension('x', new_x.shape[0])
new_nc_file.createDimension('y', new_y.shape[0])
x_var = new_nc_file.createVariable('x', 'f8', ('x',), zlib=False)
y_var = new_nc_file.createVariable('y', 'f8', ('y',), zlib=False)
chunk_sizes = (1, x_var.size)
z_var = new_nc_file.createVariable('z', np.float32, ('y', 'x'),
fill_value=np.float32(np.nan), chunksizes=chunk_sizes,
zlib=True)
x_var[:] = new_x
y_var[:] = new_y
z_var[:] = new_z
copy_variable_attributes(nc_file.variables['x'], x_var)
copy_variable_attributes(nc_file.variables['y'], y_var)
copy_variable_attributes(nc_file.variables['z'], z_var)
copy_polar_stereographic(nc_file, new_nc_file)
print(f"数据已保存到 {output_file_path}")
if __name__ == '__main__':
input_file_path = r'F:\Polar\data\wind_speed_241130.nc'
output_file_path = fr'F:\Polar\data\{formatted_time}-wind_speed_241130.nc'
create_and_save_nc(input_file_path, output_file_path, extension_count=250)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步