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

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

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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷心没有菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值