由于模型方便读取降雨数据,由之前处理好的标准化CMIP6 nc文件读取每日的降雨,改写成行列标准化的asc文件。代码如下:
import netCDF4 as nc
import os
from datetime import datetime, timedelta
era5_reference_time = datetime(1850, 1, 1, 0, 0, 0)
nc_file = 'MRI-ESM2-0_ssp585_20510927-20780621_Standard.nc'
output_path = "./MRI-ESM2-0_ssp585/prec_"
print(nc_file)
dataset = nc.Dataset(nc_file, 'r')
variable_names = list(dataset.variables.keys())
for var_name in variable_names:
print(var_name)
# 读取变量
runoff = dataset.variables['pr'][:]
time = dataset.variables['time'][:]
for t in range(runoff.shape[0]):
time_delta = timedelta(days=int(time[t]))
utc_time = era5_reference_time + time_delta
formatted_utc_time = utc_time.strftime('%Y%m%d%H')
hh = utc_time.strftime('%H')
yymmddhh = formatted_utc_time
outfile = output_path +yymmddhh + ".txt"
print("Now Output: ",outfile)
of = open(outfile,"w")
of.write("ncols 361")
of.write("\n")
of.write("nrows 181")
of.write("\n")
of.write("xllcorner -180")
of.write("\n")
of.write("yllcorner -90")
of.write("\n")
of.write("cellsize 1")
of.write("\n")
of.write("NODATA_value -9999")
of.write("\n")
for i in range(runoff.shape[1]):
for j in range(181,361):
if (str(runoff[t][i][j]) == "--"):
of.write("-9999 ")
else:
value = runoff[t][i][j]*86400
of.write(f"{value:.2f} ")
for j in range(0,181):
if (str(runoff[t][i][j]) == "--"):
of.write("-9999 ")
else:
value = runoff[t][i][j]*86400
of.write(f"{value:.2f} ")
of.write("\n")
of.close()
dataset.close()