用Python实现ASCII类型栅格数据转NC文件(二)

Hello!Hello!
大家好
这次应粉丝的需求,将ASCII数据批量转为NC文件并要求有时间维。

文章目录

  • 数据介绍
  • 代码
  • 文件下载链接

数据介绍

本次数据有粉丝直接提供。数据格式如下:

文件名称的 后八位包含日期信息
在这里插入图片描述
文件内部与传统ascii文件一样
用Python实现ASCII类型栅格数据转NC文件(二)_第1张图片
经粉丝统一该部分数据我将作为示例数据,在文末提供下载链接。

代码

本次代码就不进行详细讲解了,核心部分与之前的文章是一摸一样的,仅仅只是在外层套了循环,因此我将详细的注释直接卸载代码中,需要详细学的朋友们可以直接观看这篇文章

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

链接挂了通缉一下我啦,我会及时更新的!!!!!!!!!!!

你可能感兴趣的:(python,开发语言,numpy)