python裁剪nc文件数据

问题描述:

若干个nc文件储存全球的1850-2014年月尺度的mrro数据(或其他数据),从1850-1到2014-12一共1980个月,要提取出最后35年1980.1~2014.12年也就是420个月的数据。

代码实现

def aaa(input_file,output_file,bianliang,start_index,end_index):
    # 打开输入NetCDF文件
    ds = nc.Dataset(input_file, 'r')
    # 获取时间变量和mrro变量 这里不一定是mrro变量,名称由传入参数bianliang确定
    time_var = ds.variables['time']
    mrro_var = ds.variables[bianliang]

    time_indices = np.arange(start_index, end_index)

    time_data = time_var[time_indices]
    mrro_data = mrro_var[time_indices, :, :] 

    # 创建新的NetCDF文件
    new_ds = nc.Dataset(output_file, 'w', format='NETCDF4')

    # 创建维度(这些在新数据集中还不存在)
    new_ds.createDimension('time', None)  # 可变长度维度,或者指定确切长度len(time_data)
    lat_dim = new_ds.createDimension('lat', len(ds.dimensions['lat']))
    lon_dim = new_ds.createDimension('lon', len(ds.dimensions['lon']))

    # 创建新变量
    times = new_ds.createVariable('time', time_var.datatype, ('time',))
    lats = new_ds.createVariable('lat', ds.variables['lat'].datatype, ('lat',))
    lons = new_ds.createVariable('lon', ds.variables['lon'].datatype, ('lon',))
    mrro = new_ds.createVariable(bianliang, mrro_var.datatype, ('time', 'lat', 'lon'))

    # 复制变量属性
    times.setncatts({k: time_var.getncattr(k) for k in time_var.ncattrs()})
    lats.setncatts({k: ds.variables['lat'].getncattr(k) for k in ds.variables['lat'].ncattrs()})
    lons.setncatts({k: ds.variables['lon'].getncattr(k) for k in ds.variables['lon'].ncattrs()})
    mrro.setncatts({k: mrro_var.getncattr(k) for k in mrro_var.ncattrs()})

    # 写入数据
    times[:] = time_data  # 确保time_data是正确的!
    lats[:] = ds.variables['lat'][:]
    lons[:] = ds.variables['lon'][:]
    mrro[:] = mrro_data  # 确保mrro_data是正确的!

    # 复制全局属性
    new_ds.setncatts({k: ds.getncattr(k) for k in ds.ncattrs() if k != 'history'})  # 避免覆盖我们即将设置的历史属性

    # 更新历史属性
    history = "Created by subsetting the original dataset"  # 原始数据集的历史属性可能不包含有用的信息,或者我们想要添加新的信息
    new_ds.setncattr('history', history)

    # 关闭文件
    new_ds.close()
    ds.close()
    print("完成")
import glob
import netCDF4 as nc
import numpy as np
import os

def get_nc_files(directory):
    # 使用 os.path.join 确保路径格式正确
    pattern = os.path.join(directory, '*.nc')
    nc_files = glob.glob(pattern)
    # 如果只需要文件名而不是完整路径,可以使用 os.path.basename 提取
    nc_files = [os.path.basename(file) for file in nc_files]
    return nc_files

start_index = 1560  # 数据起点
end_index = 1980  # 数据终点
directory_path = './'
nc_files_list = get_nc_files(directory_path)
for ncfile in nc_files_list:
    print(ncfile)
    input_file = ncfile
    s  = ''
    s += str(ncfile)
    output_file = s.replace('185001', '198001')
    bianliang = input_file.split('_')[0] # 根据文件名称获取变量名
    aaa(input_file,output_file,bianliang,start_index,end_index)


将python文件和待处理文件放一起
在这里插入图片描述
运行代码
在这里插入图片描述
在这里插入图片描述
依赖库

netCDF4
numpy

高版本python直接pip install 安装?

netCDF4
numpy

低版本python(我用的3.7,用pip直接安装netCDF4总报错)
解决办法:

pip install "netCDF4<1.6.0"

安装低版本的netCDF4,搞定。

ps: 代码粗糙,欢迎交流学习。

### MATLAB 中裁剪 NetCDF 文件的方法 在 MATLAB 中,可以通过 `ncread` 函数读取 `.nc` 文件的内容,并通过索引操作实现对特定区域或时间范围的数据裁剪。以下是具体方法和代码示例: #### 1. 使用 `ncread` 和索引裁剪数据 假设有一个三维的 NetCDF 数据集 `(time, lat, lon)` 或四维数据集 `(level, time, lat, lon)`,可以按照以下方式裁剪指定的时间范围、经纬度范围或其他维度。 ```matlab % 假设 .nc 文件名为 'example.nc' filename = 'example.nc'; % 获取变量名 (例如 temperature) varName = 'temperature'; % 读取整个变量数据 data = ncread(filename, varName); % 获取纬度、经度和时间信息 latitudes = ncread(filename, 'latitude'); longitudes = ncread(filename, 'longitude'); times = ncread(filename, 'time'); % 定义裁剪范围 lat_min = 20; % 纬度下限 lat_max = 40; % 纬度上限 lon_min = -100; % 经度下限 lon_max = -80; % 经度上限 % 查找符合条件的索引 lat_indices = find(latitudes >= lat_min & latitudes <= lat_max); lon_indices = find(longitudes >= lon_min & longitudes <= lon_max); % 裁剪数据到指定范围 cropped_data = data(:, lat_indices, lon_indices); % 对于三维数据 ``` 对于四维数据 `(level, time, lat, lon)`,可以在加载前选择某个水平层(如地面层),然后再进行裁剪[^4]。 ```matlab % 打开 nc 文件并选择 level 层次 ds = ncreadatt(filename, 'level'); % 如果有层次信息 selected_level = ds(1); % 选择第一个层次作为例子 % 修改读取逻辑以适应四维数据 full_data = ncread(filename, varName); cropped_data = full_data(selected_level, :, lat_indices, lon_indices); ``` #### 2. 可视化裁剪后的结果 完成裁剪后,可利用 MATLAB 的绘图功能对结果进行可视化展示。 ```matlab figure; imagesc(lon_indices, lat_indices, squeezed_cropped_data(:,:,end)); % 显示最后一个时刻的结果 colorbar; title('Cropped Data Visualization'); xlabel('Longitude Index'); ylabel('Latitude Index'); ``` 以上展示了如何使用 MATLAB 实现 NetCDF 文件的空间裁剪以及基本的可视化过程[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walfar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值