如何编写循环为ERA5 netCDF4文件每个格点生成逐日相对湿度txt文件
问题背景
我有一份从ERA5平台下载的netCDF4文件,内含格点化逐日相对湿度数据,相关参数如下:
- 格点尺寸(X, Y):0.25 × 0.25
- 数据时间范围:2001年1月1日至2018年12月31日
已完成的预处理代码如下:
from netCDF4 import Dataset from osgeo import gdal import os import numpy as np import pandas as pd # 读取netCDF文件 data = Dataset(r'C:\Users\obarresi\Desktop\ERA\moisture\humidity.nc', 'r') # 替换为你的文件存储路径 data.variables.keys() # 输出为:dict_keys(['longitude', 'latitude', 'time', 'r']) # 指定输出路径 os.chdir('/Users/obarresi/Desktop/ERA/moisture') # 该路径为SWAT+文件的保存位置 # 提取变量 lat = data.variables['latitude'][:] lon = data.variables['longitude'][:] rh = data.variables['r'][:]
已确认相对湿度数组rh的维度为(时间步长, 纬度数, 经度数),单时间步下的打印示例如下:
print(rh) # 输出示例: # [[[ 75.06203241 75.03655509 76.3460895 ... 72.56525473 72.07099466 # 72.47353637] # [ 75.02381643 74.87350022 75.86711583 ... 70.91177645 70.62133496 # 70.7665557 ] # ... # [ 94.61587803 96.10375371 97.08208293 ... 70.53980753 71.31941362 # 72.21876313]]
需求说明
为每个格点单独生成TXT文件存储该点逐日相对湿度,文件格式要求如下:
- 第一行仅写入起始日期
20010101 - 从第二行开始依次写入对应日期的相对湿度数值,保留两位小数
格式示例:
20010101 75.06 80.36 40.32 ... 45.35
实现方案
直接遍历所有格点的经纬度索引,提取对应格点的全时间序列湿度值写入文件即可,代码如下:
# 提前创建输出目录,避免写入报错 output_dir = "./grid_rh_txt" os.makedirs(output_dir, exist_ok=True) # 获取各维度长度 n_time, n_lat, n_lon = rh.shape # 遍历所有格点 for lat_idx in range(n_lat): for lon_idx in range(n_lon): # 获取当前格点的经纬度,用于命名文件避免重复 current_lat = round(float(lat[lat_idx]), 4) current_lon = round(float(lon[lon_idx]), 4) file_path = os.path.join(output_dir, f"rh_lat{current_lat}_lon{current_lon}.txt") # 提取当前格点的全时间序列湿度值,保留两位小数 grid_rh_series = rh[:, lat_idx, lon_idx].round(2) # 写入文件 with open(file_path, "w", encoding="utf-8") as f: # 第一行写入起始日期 f.write("20010101\n") # 逐行写入湿度数值 for val in grid_rh_series: f.write(f"{val}\n")
如果格点数量极多觉得循环速度慢,可自行改用numpy向量化操作批量写入,普通场景下上述方案即可满足需求。
内容的提问来源于stack exchange,提问作者Luis Barresi
相关产品推荐
相关产品推荐

