当前位置:   article > 正文

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

asc集转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文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

文件下载链接

链接:https://pan.baidu.com/s/18ecSpjyfQtb4ZBLQAvADgQ?pwd=ki3s
提取码:ki3s

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/656391
推荐阅读
相关标签
  

闽ICP备14008679号