NC文件(monthly)转为多张TIF文件

将一个NC文件里每一年中的每月均转出为TIF图像,并存为一个目录下。

import xarray as xr
import rasterio
from rasterio.transform import from_origin
import pandas as pd

# 读取您的NC文件
nc_file = "D:\\NC\\Surface-net-solar-radiation\\szjmean.nc"
ds = xr.open_dataset(nc_file)

# 获取数据变量名,这里假设变量名为"ssr"
variable_name = "ssr"
data = ds[variable_name]

# 设置TIFF图像的元数据
profile = {
    "driver": "GTiff",
    "height": data.shape[1],
    "width": data.shape[2],
    "count": 1,
    "dtype": rasterio.float32,
    "crs": "+proj=latlong",
    "transform": from_origin(
        ds.coords["longitude"].values[0], ds.coords["latitude"].values[0], 1, 1
    ),
    "compress": "lzw",
}

# 遍历每个时间点的数据并将其导出为TIFF图像
for time_idx, time in enumerate(data.coords["time"].values):
    timestamp = pd.Timestamp(time)
    year = timestamp.year
    month = timestamp.month
    #下面是你要输出文件的目录,记得改好目录
    output_file = f"D:\\NC\\Surface-net-solar-radiation\\tif\\_{year}_month_{month}.tif"

    with rasterio.open(output_file, "w", **profile) as dst:
        dst.write(data[time_idx].values.astype(rasterio.float32), 1)

# 关闭NetCDF数据集
ds.close()
  • "driver": "GTiff":指定输出文件的格式为GeoTIFF。

  • "height": data.shape[1]:设置输出TIFF图像的高度(行数),从输入的NetCDF数据中获取。

  • "width": data.shape[2]:设置输出TIFF图像的宽度(列数),从输入的NetCDF数据中获取。

  • "count": 1:设置输出TIFF图像的波段数量。在这里,我们只输出一个波段,即NetCDF变量中的一个时间点的数据。

  • "dtype": rasterio.float32:设置输出TIFF图像的数据类型。在这里,我们使用32位浮点数。你可以根据输入数据的类型相应地更改此设置。

  • "crs": "+proj=latlong":设置输出TIFF图像的坐标参考系统。这里我们使用经纬度坐标系。你可能需要根据输入数据的坐标系进行修改。

  • "transform": from_origin(ds.coords["longitude"].values[0], ds.coords["latitude"].values[-1], 1, 1):设置输出TIFF图像的仿射变换矩阵。from_origin()函数会根据给定的左上角经纬度坐标(ds.coords["longitude"].values[0]ds.coords["latitude"].values[-1])以及像元大小(1 x 1)生成一个仿射变换矩阵。

  • "compress": "lzw":设置输出TIFF图像的压缩方式。在这里,我们使用Lempel-Ziv-Welch (LZW) 压缩算法,它是一种无损压缩算法,能有效地降低TIFF图像文件的大小,而不会损失任何数据。

在处理气象、气候或时间序列数据时,有时候我们需要对特定年份的数据进行特殊处理,例如计算每年末尾一组数据与次年年初两组数据的平均值。这个过程通常涉及到读取名为“nc”(NetCDF)文件,这是一种常用的科学数据存储格式。 以下是一个简单的步骤说明: 1. **打开NC文件**:使用相应的库,如`xarray`或`numpy`,打开包含年度数据的NC文件,并加载其中的时间变量和相关的数据数组。 ```python import xarray as xr dataset = xr.open_dataset('your_file.nc') time_var = dataset['time'] # 假设time是时间坐标 data_array = dataset['your_data_variable'] # 你要操作的数据变量 ``` 2. **获取数据子集**:根据时间变量筛选出每年的最后一组数据和次年的前两组数据。这里假设时间是一维的,且单位为天数。 ```python end_of_year = time_var.isel(time=slice(-1, None)) # 年度最后一组数据 beginning_next_year = time_var.isel(time=slice(None, -1, -1))[:2] # 次年第一和第二组数据 ``` 3. **计算平均值**:将这两部分数据合并并求平均。 ```python combined_data = np.concatenate([end_of_year.values, beginning_next_year.values]) yearly_avg = np.mean(combined_data, axis=0) ``` 4. **保存结果**:如果需要,将计算后的平均值存入新的变量或回写到原始文件中。 ```python # 新建一个新数组维度和原数据一致 monthly_avg_series = data_array[...].isel(time=slice(None, None, -1)).expand_dims('month', axis=-1) # 将平均值插入对应月份位置 monthly_avg_series['month'] = np.arange(1, 13) # 假设一年12个月 monthly_avg_series['average'] = yearly_avg # 如果要保存到文件 monthly_avg_series.to_netcdf('average_data.nc', mode='a', group='annual_averages') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

佛量举小瘦子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值