基于Python的大区域SPI标准降水指数自动批量化处理

news2024/10/5 12:49:11

1.引言

         标准化降水指数(SPI)是一个广泛使用的指数,用于描述一系列时间尺度上的气象干旱的特征。但是经过研究发现,目前的处理方法基本都是单点进行计算,缺少多点(大区域)的批量计算过程。因此本博客从气象数据下载,处理成NC格式文件以及依靠climate indices库完成多点的SPI指数计算,并可以在ARCGIS中利用反距离权重生成指数SPI栅格数据。本文有博主整理的完成Python代码资源以及样例数据。

2.SPI原理概述

        SPI计算原理是将某时间尺度(如1、3、6、12个月等)降水量的连续时间序列(最好是长期记录,一般最少30年)看作服从某种概率密度函数分布(如gamma分布),然后推导出相应的累积概率函数,再通过累积概率函数转换为标准正态分布。转换之后,某时间尺度样本的SPI为:该样本降水量的累积概率所对应的标准正态分布的x轴的值。

        例如:以3个月为时间尺度,使用1981-2010年30年的降水数据。计算2010年1月的SPI值。因为时间尺度是3个月,所以2010年1月的累积降水量被定义为2009年11月-2010年1月期间的总降水量,记作P;使用的时间序列为往年同期的降水量数据,即各年11月-1月的降水。首先按照原理,将时间序列数据假设为满足gamma分布g(x),然后推导其累积概率函数H(x),再转换为标准正态分布。然后,查找P对应的累积概率H(P),然后查找与H(P)相同累积概率的标准正态分布所对应的x轴的值,即为SPI。示意图如下,左图为累积概率H(x),右图为转换之后的标准正态分布。

图1 从虚线伽马分布到标准正态分布的等概率变换的例子

详细的数学原理请参考博客

3.技术方法

3.1 气象数据下载

        首先,我们需要下载30年某一区域的降水数据。因为长时间序列数据一般来说不太好获取,博主使用的是NASA POWER提供的气象数据,是免费的。

网站:NASA POWER | Data Access Viewer

  • 入下图所示,我们选择东北的区域的数据,时间范围为:1992-2022。因为选择的是月度数据,网站只更新到1992-2020,后面2021与2022只能下载日度的数据进行累积后处理。(文尾提供Python代码与样例气象数据,1_merge_daily_precipitation.py)

图2 NASA POWER VIEWER 网站页面

  • 下图为博主下载的区域气象数据,格式为csv,打开可以看到。数据其实是按照经度纬度各网点排列的,因为NASA提供的是0.5°×0.5°的分辨率数据,所以整个吉林省为20×12个点。列JAN-DEC为每个月的降水数据。

  • 需要注意的是,因为2021与2022为日度数据所以需要进行自己累积计算,算完后合并到1992-2020中即可。
j2022=r"raw_data\jilinday2022.csv"
    weather_table = pd.read_csv(j2022)
    IS_ALL_Month=False
    if IS_ALL_Month:
        out_dic={"PARAMETER":[],"YEAR":[],"LAT":[],"LON":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],
            "8":[],"9":[],"10":[],"11":[],"12":[]}
    else:
        out_dic={"PARAMETER":[],"YEAR":[],"LAT":[],"LON":[],"1":[],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],
            "8":[]}
    
    weather_table=weather_table.set_index(['LAT', 'LON','MO'])    
    for y in (weather_table.index.get_level_values(0).unique()):#纬度方向
        data_y=weather_table[(weather_table.index.get_level_values(0) == y)]
        for x in (data_y.index.get_level_values(1).unique()):#经度方向
            data_yx=data_y[(data_y.index.get_level_values(1) == x)]
            for month in (data_yx.index.get_level_values(2).unique()):
                data_month = data_yx[(data_yx.index.get_level_values(2) == month)]
                out_dic[str(month)]=out_dic[str(month)]+[np.sum(data_month["PRECTOTCORR"].values)]
            #循环日累加
            out_dic["PARAMETER"]=out_dic["PARAMETER"]+["PRECTOTCORR_SUM"]
            out_dic["YEAR"]=out_dic["YEAR"]+[2022]
            out_dic["LAT"]=out_dic["LAT"]+[y]
            out_dic["LON"]=out_dic["LON"]+[x]
    df_out=pd.DataFrame(out_dic)
    df_out.to_csv(r"process_data\jilin2022.csv",index=False)

3.2 安装 climate indices库

       本博客在计算SPI指数时候需要安装climate indices库。

        climate indices 是由James Adams利用Python开发的一个计算各种气象指数,包括SPEI, SPI, PET, PDSI, scPDSI的库,可以使用pip install 来安装该库。

        在cmd 中启动python,导入climate_indices库,如果没提示错误,则表示安装成功。

        同时,在python\Scripts 文件夹中会生成这个process_climate_indices.exe,后面批处理主要依靠这个exe。

注意:如果按照报错,可以使用文尾资源中的lib\climate_indices-py3.8.whl文件按照,这个已经让地理所老师重新编译,适用于window10-11,python3.8环境。 

3.3 转换NC气象格式数据

        因为想要使用climate indices,输入数据必须为nc格式的数据,因此我们必须要将处理得到的xlsx降水数据生成nc文件(2_write_ncfile.py)。

#---netcdf foramt---#
    f_w = nc.Dataset(outpath,'w',format = 'NETCDF4')
    f_w.createDimension('time',times)   
    f_w.createDimension('lat',y_size)   
    f_w.createDimension('lon',x_size)
    ##创建变量。参数依次为:‘变量名称’,‘数据类型’,‘基础维度信息’
    time=f_w.createVariable('time',"S19",('time')) 
    for i in range(times):
        #time[i] = data_serise[i].strftime('%Y-%m-%d')
        time[i] = data_serise[i].strftime('%Y-%m-%d %H:%M:%S')
    time.units = 'times since {0:s}'.format(time[0])
    time.standard_name = 'Time'
    time.axis = 'T' 
    f_w.createVariable('lat',np.float32,('lat'))  
    f_w.createVariable('lon',np.float32,('lon'))
    #t=np.linspace(0,times-1,times,dtype=int)
    lon=np.linspace(min_x,max_x,x_size,dtype=float)
    lat=np.linspace(min_y,max_y,y_size,dtype=float)
    #写入变量time的数据。维度必须与定义的一致。
    #f_w.variables['time'][:]=data_serise#np.array(list_data)#data_serise
    f_w.variables['lon'][:]=lon
    f_w.variables['lat'][:]=lat
    #xarray_data_r=np.transpose(xarray_data,(3,2,0,1))
    #f_w.createVariable( "prcp", np.float32, ('time','lat','lon'),fill_value=fill_value)
    f_w.createVariable( "prcp", np.float32, ('lat','lon',"time"),fill_value=fill_value)
    #f_w.variables["prcp"][:]=xarray_data_r[0]
    f_w.variables["prcp"][:]=xarray_data[:,:,:,0]
    f_w.variables["prcp"].units="millimeter"
    f_w.close

 3.4 运行批处理文件

        看到这一步,我先恭喜大家,数据获取与处理确实不易。下一步就可以运行我们的批处理文件了(3_cal_SPIindex.py)。下面对其中的一些参数进行解释:

变量名称含义

index

想要运行的指数名称,选择“spi”

periodicity

周期,选择月度“monthly“

netcdf_precip

输入气象数据,nc格式

var_name_precip

字段名称,选择”prcp“

output_file_base

输出的spi的nc结果数据名称

scales

尺度,应该是跟gamma函数有关,选择3

calibration_start_year

开始年份

calibration_end_year

结束年份

multiprocessing

多进程处理,选择all

3.5 转成ArcGIS可以导入的格式

        运行完3.4后,可以生成后缀为nc_spi_gamma_03.nc与nc_spi_pearson_03.nc格式的结果文件,运行4_SPI2xlsx.py文件,可以转成excel文件,导入arcgis结果如下:


4.结果展示

4.1 SPI 点位结果展示

        如下图所示,这是通过我们批处理计算得到的吉林省多点的SPI点状数据:

4.2 生成整个区域面状结果

        这里我们需要在4.1的基础上,结合ArcGIS工具中的Spatial Analyst tools /Interpolation/IDW插值得到插值栅格影像。

        其中分辨率那一栏,可以根据需求自己设置,需要注意的是这里的分辨率单位是°,不是米。插值结果如下:

4.3 写在最后

        完整资源和样例数据地址如下https://download.csdn.net/download/u010329292/88291585:需要的小伙伴可以供下载学习:)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/975173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Linux开发实操(十六):Linux驱动模型driver model

嵌入式linux下驱动模型: 1、驱动的绑定 驱动程序绑定driver binding 驱动程序绑定是将设备device与可以控制它的设备驱动程序driver相关联的过程。总线驱动程序bus driver通常会处理,因为有特定于总线bus的结构来表示设备device和驱动程序driver。使用通用的设备device和设…

es倒排索引深入解读

文章目录 一. Lucene二.倒排索引算法2.1 Posting List压缩算法2.1.1 FOR2.1.2 RoaringBitmap压缩 2.3 FST压缩算法2.3.1 trie前缀树原理2.3.2 FST构建过程NFADFAFSMFSAFST:有限状态转换机构建原理FST在lucene中实现原理 1.什么是搜索引擎? 全文搜索引擎: 自然语言处理(NLP)、爬…

Full authentication is required to access this resource解决办法

我们在使用postman调接口时候,有的时候需要权限才可以访问,否则可能会报下面这个错误 {"timestamp": xxxxxx,"status": 401,"error": "Unauthorized","message": "Full authentication is requ…

Matlab信号处理1:模拟去除信号噪声

由于工作内容涉及信号系统、信号处理相关知识,本人本硕均为计算机相关专业,专业、研究方向均未涉及信号相关知识,因此需进行系统地学习。之前已将《信号与系统》快速过了一遍,但感觉较抽象且理解较浅显。在此系统地学习如何使用Ma…

PTA L1-011 A-B C++解法

我的答案 #include<iostream> #include <string> using namespace std;int main() {//先用数组去存储输入的A和B&#xff0c;然后遍历数组A&#xff0c;B&#xff0c;相同的字母去除&#xff0c;不同的字母留下&#xff0c;最后输出string A, B;getline(cin, A);g…

Nomad 系列-安装

系列文章 Nomad 系列文章 Nomad 简介 开新坑&#xff01;近期算是把自己的家庭实验室环境初步搞好了&#xff0c;终于可以开始进入正题研究了。 首先开始的是 HashiCorp Nomad 系列&#xff0c;欢迎阅读。 关于 Nomad 的简介&#xff0c;之前在 大规模 IoT 边缘容器集群管…

java IO流(二) 字符流 缓冲流 原始流与缓冲流性能分析

字符流 前面学习的字节流虽然可以读取文件中的字节数据&#xff0c;但是如果文件中有中文&#xff0c;使用字节流来读取&#xff0c;就有可能读到半个汉字的情况&#xff0c;这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码&#xff0c;但是如果文件过大又不太合适。…

递归入门,例题详解,汉诺塔问题,全排列问题,整数划分问题,两数相加

问题一&#xff1a;阶乘 对于阶乘n!&#xff0c;也就是从1一直乘到n&#xff0c;我们可以很简单的使用一个for循环来解决这个问题&#xff0c;但是如果使用递归的思路&#xff0c;那么我们需要思考如果将当前的问题分解为规模更小的问题&#xff0c;对于n的阶乘&#xff0c;我…

论文解读 | KPConv——点云上的可形变卷积网络

原创 | 文 BFT机器人 《KPConv: Flexible and Deformable Convolution for Point Clouds》是一篇发表于2019年的研究论文&#xff0c;作者为Hugues Thomas、Charles R. Qi、Jean-Emmanuel Deschaud、Beatriz Marcotegui和Franois Goulette。这篇论文关注于点云数据上的卷积操作…

前置微小信号放大器是什么

前置微小信号放大器是一种专门用于放大微弱输入信号的电子设备。它常用于电子测量、信号传输、音频放大等领域&#xff0c;能够将微小的输入信号放大到足够大的幅度&#xff0c;以便后续处理或传输。下面我们将从工作原理、应用和发展趋势三个方面&#xff0c;详细探讨前置微小…

在国内PMP的含金量高吗?

首先我们需要了解一下PMP证书的用处 PMP含金量是毋庸置疑的&#xff0c;从事项目/产品/运营/管理/IT行业的社会人基本都会将这个证收入囊中。其他有升职涨薪计划的也在悄咪咪报考蓄力中&#xff0c;能在职业生涯锦上添花&#xff0c;精益求精。 一&#xff0c;PMP证书的优势体…

什么是安全运营中心(SOC),应该了解什么

安全运营中心&#xff08;SOC&#xff09; 是一种企业监视和警报设施&#xff0c;可帮助组织检测安全威胁、监视安全事件和分析性能数据以改进公司运营。 什么是安全运营中心&#xff08;SOC&#xff09; 安全运营中心&#xff08;SOC&#xff09;是一个中央监视和监视中心&a…

安装气象站的重要意义是什么?

气象站是一种用于观测、记录和报告天气数据的设备或系统。它通常包括各种传感器、供电系统和环境监控主机&#xff0c;用于测量和记录气温、湿度、风速、风向、气压、降雨量、雪深等气象参数。 气象站有多种类型&#xff0c;包括自动气象站、人工气象站和便携式气象站。自动气…

elementUI可拖拉宽度抽屉

1&#xff0c;需求&#xff1a; 在elementUI的抽屉基础上&#xff0c;添加可拖动侧边栏宽度的功能&#xff0c;实现效果如下&#xff1a; 2&#xff0c;在原组件上添加自定义命令 <el-drawer v-drawerDrag"left" :visible.sync"drawerVisible" direc…

【狂神】SpringMVC 怎样才能直接手动输入.jsp的页面就可以访问了?

看秦老师视频的时候&#xff0c;觉得非常疑惑&#xff0c;为什么可以直接输入form.jsp就能跳转到相应地页面。如果你和我一样眼瞎&#xff0c;那确实是有点崩溃。注意看&#xff1a; 发现了吗&#xff1f;这几个文件并没有放在WEB-INF文件下&#xff0c;所以视图解析器便不生效…

实用技巧:使用Python进行文本处理

引言 作为一个Linux持续学习者&#xff0c;我们经常需要处理文本文件&#xff0c;例如提取特定内容、格式化数据或者进行文本分析等。在这篇文章中&#xff0c;我将介绍使用Python进行文本处理的一些实用技巧&#xff0c;帮助你更有效地处理文本数据。无需担心&#xff0c;你不…

pdf可以编辑修改内容吗?看看这几种编辑方法

pdf可以编辑修改内容吗&#xff1f;PDF文件是一种广泛使用的文件格式&#xff0c;但是有时候我们需要对PDF文件进行编辑和修改。那么&#xff0c;PDF文件可以编辑修改内容吗&#xff1f;答案是肯定的。下面介绍几种编辑PDF文件的方法。 第一种方法是使用【迅捷PDF编辑器】。 这…

java JUC并发编程 第六章 CAS

系列文章目录 第一章 java JUC并发编程 Future: link 第二章 java JUC并发编程 多线程锁: link 第三章 java JUC并发编程 中断机制: link 第四章 java JUC并发编程 java内存模型JMM: link 第五章 java JUC并发编程 volatile与JMM: link 第六章 java JUC并发编程 CAS: link 文章…

Springboot上传文件

上传文件示例代码&#xff1a; ApiOperation("上传文件") PostMapping(value "/uploadFile", consumes MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResult<String> uploadFile(RequestPart("file") MultipartFile file) { //调用七…

从0开始 yolov5可以用灰度图像进行训练和检测吗

yolov5可以用灰度图像进行训练吗,从0开始yolov5灰度图训练和检测 文章目录 yolov5可以用灰度图像进行训练吗,从0开始yolov5灰度图训练和检测[toc]1 预演【表1-1 模型结构截取】 2 修改源码使可以灰度训练2.1 修改读取图片模式2.2 修改源码传参中的通道数2.3 运行train.py2.4 修…