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
链接挂了通缉一下我啦,我会及时更新的!!!!!!!!!!!