赞
踩
Hello!Hello!
大家好
这次应粉丝的需求,将ASCII数据批量转为NC文件并要求有时间维。
本次数据有粉丝直接提供。数据格式如下:
文件名称的 后八位包含日期信息
文件内部与传统ascii文件一样
经粉丝统一该部分数据我将作为示例数据,在文末提供下载链接。
本次代码就不进行详细讲解了,核心部分与之前的文章是一摸一样的,仅仅只是在外层套了循环,因此我将详细的注释直接卸载代码中,需要详细学的朋友们可以直接观看这篇文章
import os import xarray as xr import numpy as np from pandas import to_datetime folder_path = r'E:\CSDN\降雨/' # 最后的/不能少 output_path = r'E:\CSDN/rain.nc' # 输出文件路径 def judge_file_type(folder_path,file_type): # 判断文件类型 # folder_path: 文件夹路径 # file_type: 文件类型 file_list = [] for root, dirs, files in os.walk(folder_path): for file in files: if file.endswith(file_type): file_list.append(file) return file_list def read_ASCII(file): # 读取ASCII文件 # file: ASCII文件 file_tep = [] for j in range(len(file)): if len(file[j].split()) != 0: file_tep.append(file[j]) file = file_tep return file file_list = judge_file_type(folder_path,'.asc') # 获取文件夹中所有的asc文件 reslut_array = [] # 存储所有的数据 time_list = [] # 存储所有的时间 for file_index in range(len(file_list)): # 读取所有的文件 with open(folder_path+file_list[file_index],'r') as f: # 读取文件 date = file_list[file_index].split('.')[0].split('-')[-1] # 获取时间 date = to_datetime(date,format='%Y%m%d') # 将时间转换为datetime格式 time_list.append(date) # 将时间添加到time_list中 print('当前正在进行:{}'.format(date)) # 打印当前正在进行的时间 file = read_ASCII(f.readlines()) # 读取文件 for num,value in enumerate(file): # 读取文件中的信息 value = value.split() if len(value) != 0: if num == 0: cols = int(value[-1]) elif num == 1: rows = int(value[-1]) elif num == 2: s_lon = float(value[-1]) elif num == 3: s_lat = float(value[-1]) elif num == 4: cell_size = float(value[-1]) elif num == 5: mask_value = float(value[-1]) lon = np.arange(s_lon,s_lon+cols*cell_size,cell_size) # 生成经度 lat = np.arange(s_lat,s_lat+rows*cell_size,cell_size) # 生成纬度 lat = lat[::-1] # 将纬度倒序 values_array = np.zeros((rows,cols)) # 生成存储数据的数组 f.seek(0) # 将文件指针重新定位到文件开头 n = 0 for num,value in enumerate(file): value = value.split() if len(value) != 0: # 如果文件中有空行,则不进行读取 if num > 5: for j in range(len(value)): if float(value[j]) == mask_value: value[j] = np.nan # 根据mask_value将mask_value设置为nan else: value[j] = float(value[j]) # 将数据转换为float类型 values_array[n,:] = value n = n+1 reslut_array.append(values_array) reslut_array = np.array(reslut_array) ds = xr.Dataset() # 生成一个空的数据集 ds['time'] = time_list # 将时间添加到数据集中 ds['lon'] = lon # 将经度添加到数据集中 ds['lat'] = lat # 将纬度添加到数据集中 ds['rain'] = (('time','lat','lon'),reslut_array) # 将数据添加到数据集中 ds['lon'].attrs['units'] = 'degrees_east' # 添加经度的单位 ds['lat'].attrs['units'] = 'degrees_north' # 添加纬度的单位 ds['rain'].attrs['units'] = 'mm' # 添加数据的单位 ds.to_netcdf(output_path) # 将数据集输出为nc文件
链接:https://pan.baidu.com/s/18ecSpjyfQtb4ZBLQAvADgQ?pwd=ki3s
提取码:ki3s
链接挂了通缉一下我啦,我会及时更新的!!!!!!!!!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。