netcdf文件复制并修改

news/2024/11/29 21:36:59/文章来源:https://www.cnblogs.com/echohye/p/18577608
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_lstdef copy_variable_attributes(src_var, dst_var):"""复制变量的所有属性并设置分块大小:param src_var: 源变量:param dst_var: 目标变量"""# 复制变量的属性for attr_name in src_var.ncattrs():if attr_name != '_FillValue':  # 跳过 _FillValuedst_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)# 设置 GeoTransform(示例值,可以根据需要调整)polar_stereographic_target.GeoTransform = f'-{x_max} 6250 0 {y_yax} 0 -6250'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)"""# 打开原始 NetCDF 文件并读取数据with Dataset(input_file_path, mode='r') as nc_file:# 读取现有的 x、y 和 zx = 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)  # 在 x 轴增加指定数量的点new_y = extend_list(y, extension_count)  # 在 y 轴增加指定数量的点# 创建新的 z 数组,形状为新的 x 和 y 的交叉形状new_z = np.full((new_y.shape[0], new_x.shape[0]), 50, dtype=np.float32)  # 新数组赋值为 50# 将现有的 z 数组放入新的 z 数组中,保持原有数据new_z[extension_count:y_size + extension_count, extension_count:x_size + extension_count] = z  # 现有数据放入新数组的中间# 创建新的 NetCDF 文件来保存数据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)# 设置分块大小 (例如: 'x' 维度块大小为 1,'y' 维度块大小为 1264)chunk_sizes = (1, x_var.size)  # 根据你的需求设置块大小z_var = new_nc_file.createVariable('z', np.float32, ('y', 'x'),fill_value=nc_file.variables['z']._FillValue, chunksizes=chunk_sizes,zlib=True)# 将数据写入变量x_var[:] = new_xy_var[:] = new_yz_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\sea_ice_concentration_241130.nc'output_file_path = fr'F:\Polar\data\{formatted_time}-sea_ice_concentration_241130.nc'create_and_save_nc(input_file_path, output_file_path, extension_count=100)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843688.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现四

部分功能:实名认证信息数据层Dao、银行卡类型信息数据层Dao、卡种类信息数据层Dao、卡类型信息数据层Dao、卡面值信息数据层Dao一、前言介绍: 免费学习:猿来入此 1.1 项目摘要 随着电子商务和在线支付技术的快速发展,数字商品和虚拟货币的交易需求日益增长。点卡及各种卡类…

kafka的搭建与使用

官网下载地址https://kafka.apache.org/downloads1、上传解压tar -zxvf kafka_2.11-1.0.0.tgz -C ../ mv kafka_2.11-1.0.0 kafka-1.0.02、修改环境变量 配置环境变量vim /etc/profileexport KAFKA_HOME=/usr/local/soft/kafka-1.0.0 export PATH=$PATH:$KAFKA_HOME/binsource …

河北公需课代 (可以补)

学时30个,需要联系15689397956

技术框架对MyBatis的入门学习

MyBatis快速入门 在回顾JDBC时,我们已经创建有Maven工程,而且在pom.xml中也已经导入 mysql 依赖包,这里就直接在原有工程上搭建MyBatis环境,以及使用MyBatis来实现JDBC查询user的操作流程。 MyBatis环境搭建 首先,在 Maven 项目的 pom.xml 中添加 MyBatis 的依赖 jar 包 &…

基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)for t=1:Iterstfor i=1:Numif xwoa(i,1)<0xwoa(i,1)=0.1; endif xwoa(i,2)<0xwoa(i,2)=0.001; end%目标函数更新[pa(i)] = f…

安装苹果系统台式电脑如何正确选购装机硬件

结合自己的一些装机经验和网上查阅的相关资料,给大家安利一波 “ 如何正确选配黑苹果硬件 ” 方面的相关知识。文中配置推介表中的配置都是目前在安装黑苹果上比较常见且稳定的机型,并且EFI引导文件都有现成的,在各大资源网站中也比较好找,能帮助你 快速简单的吃上黑苹果。…

JavaWeb知识点总结

JavaWeb知识点总结和学习笔记目录JavaWebjunit黑盒测试白盒测试注解所需jar包反射作用获取Class对象的方式class对象功能应用注解作用预定义的注解自定义注解解析注解动态代理ProxyMaven作用概述仓库maven依赖仓库:IDEA集成Maven高级功能JDBC概念本质快速入门各个对象抽取JDBC工…

电话号码的字母序列

题目描述 输入一个仅包含数字 2-9 的字符串,输出所有它能表示的字母序列。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入 输入一个包含数字 2-9 的字符串,长度不超过6。 输出 按字典序输出所有能表示的字母序列,每行输出一个。 输入样例 23输出…

IDEA-idea设置导航栏字体大小代码编辑区字体大小

一、设置导航栏字体大小 Setting - Appearance & Behavior - Appearance - Use custom font二、设置代码编辑区字体大小 Setting - Font - Size

Pycharm-Pycharm设置左侧导航栏字体大小和代码编辑区字体大小

一、左侧导航栏字体大小 Setting - Appearance & Behavior - Appearance - Use custom font - Size二、代码编辑区字体大小

DevEco Studio 实战第一节:字符串拼接与组件构建

DevEco Studio 实战第一节:字符串拼接与组件构建 引言 在现代软件开发中,TypeScript 提供了强类型的优势,而 DevEco Studio 作为华为推出的开发集成环境,提供了便捷的代码管理和版本控制功能。本文将通过一个简单的示例,介绍如何在 TypeScript 和 DevEco Studio 中进行字符…