首页 > 其他分享 >netcdf文件复制并修改

netcdf文件复制并修改

时间:2024-11-29 21:45:06浏览次数:3  
标签:extension nc 修改 复制 netcdf stereographic file var new

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':  # 跳过 _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)
    # 设置 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 和 z
        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)  # 在 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_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\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)

标签:extension,nc,修改,复制,netcdf,stereographic,file,var,new
From: https://www.cnblogs.com/echohye/p/18577608

相关文章

  • linux修改cst时区
    在Linux系统中,可以通过以下步骤将时区修改为CST(中国标准时间,GMT+8或称Asia/Shanghai):方法1:通过timedatectl命令修改(适用于大多数现代发行版)查看当前时区:timedatectl输出类似如下:Localtime:Fri2024-11-2910:00:00CSTUniversaltime:Fri2024-11-2902:00:00......
  • 从零开始开发 Chrome 扩展程序:修改默认新标签页
    Chrome扩展程序(ChromeExtension)是一种小型软件,可通过JavaScript、HTML和CSS扩展浏览器功能。在本教程中,我们将从零开始,开发一个Chrome扩展程序,用来自定义浏览器的默认“新标签页”(NewTab)。教程面向初学者,带你逐步完成开发,内容通俗易懂。一、开发环境准备安装G......
  • 为 Paddle2ONNX 添加修改模型输入 shape 功能
    1简介原先的tools/paddle/infer_paddle_model_shape.py脚本使用的是PaddlePaddle2.5,这里将Paddle相关API升级到2.6.0。2实现过程Paddle2.6和Paddle2.5的在推理模型输入shape上的差别主要在读取/保存模型以及存放函数的位置上有区别。2.1修改读取函数原读取模型......
  • 跳蚤市场小程序开发学习记录之个人资料修改
    完成效果如图点击修改头像可以选择从相册选择图片或拍照点击昵称可以修改昵称点击地址跳转到地址选择界面一、修改头像1.wxml文件部分代码黄色背景与头像图片、修改头像字样<!--外层的view标签,作为整体内容的容器--><view><!--内部的一个class为"top"的vie......
  • 树上可修改式背包
    树上可修改式背包题目描述给出一棵nnn个点以111为根的有根树,......
  • cURL全攻略:从浏览器复制到JMeter/Postman的一键导入
    前言        在当今的数字化时代,cURL作为一款强大的命令行工具和数据传输库,已成为开发、调试和测试过程中不可或缺的利器。它支持多种协议,如HTTP、HTTPS等,能够轻松实现数据的上传与下载,发送各种HTTP请求,并灵活设置请求头和Cookies。本文旨在详细介绍cURL的基本概念、......
  • React编译之后如何修改input控件的值
    问题: 因为React是通过setState方法改变值来影响页面展示的,所以直接修改页面值,并不能让React意识到state已经变化了。 修改自chatgpt4o提供的方法,20241129测试有效。 //第一个参数为原生组件,第二个参数为新值functionsetReactInputValue(input,value){constl......
  • 修改 PbootCMS 的邮件提醒标题
    PbootCMS提供了留言版和自定义表单的自动发送邮件提醒功能,非常方便。然而,默认的邮件标题会带有“【PbootCMS】”标识,这在为客户定制的网站中可能会带来一些不必要的麻烦。因此,我们可以对邮件标题进行优化,去掉或修改这个标识。修改步骤文件1:apps/admin/controller/system/Conf......
  • Client Hints 指纹修改
    ClientHints|BrowserScan一、ClientHints指纹介绍客户端提示是一组HTTP标头和一个JavaScriptAPI,允许Web浏览器将有关客户端设备和浏览器的详细信息发送到Web服务器。它们旨在成为User-Agent的继任者,并为Web服务器提供了一种标准化方法,以便为客户端优化内容,......
  • 屏幕分辨率|尺寸|颜色深度指纹修改
    一、前端通过window.screen接口获取屏幕分辨率尺寸颜色深度,横屏竖屏信息。 二、window.screenc++接口实现:1、third_party\blink\renderer\core\frame\screen.idl//https://drafts.csswg.org/cssom-view/#the-screen-interface[Exposed=Window]interfaceScre......