基于Python的Climate Indices库计算SPI01:不同站点不同时间尺度的SPI的计算

热闹的尽头是孤寂,在虚浮的欢闹中保持自己,纷繁世间,可报期望者不过二三。

文章目录

  • 前言
    • 1. 概述
      • 2.1 目的
      • 2.2 说明
    • 2. 版本
      • 2.1 天津,2024年1月18日,Version1
    • 3. 微信公众号GISRSGeography
  • 一、数据
    • 1. 输入数据
    • 2. 输出数据
  • 二、程序代码


前言

  此系列博文的目的是基于Python的Climate Indices库计算标准化降水指数(SPI)。

1. 概述

2.1 目的

  • 针对不同站点数据,调用Climate Indices库进行不同时间尺度的SPI的计算

2.2 说明

  • 测试数据和程序可以点击基于Pyton的Climate Indices库计算不同站点、不同时间尺度的SPI下载。

2. 版本

2.1 天津,2024年1月18日,Version1

3. 微信公众号GISRSGeography

  • 欢迎大家关注公众号 GISRSGeography,谢谢!。
    GISRSGeography

一、数据

1. 输入数据

  • 本示例的输入数据是北京、天津和石家庄三个站点的逐月气象数据。
    输入数据

2. 输出数据

  • 本示例的输出数据是逐站点存储的不同时间尺度的SPI的计算结果。
    输出数据

二、程序代码

# -*- coding: utf-8 -*-
"""
1. 程序目的
   (1) 调用climate indices库计算不同站点、不同时间尺度的spi

2. 2024年3月26日

"""
# %% 包的导入
# 包的导入
import os
import numpy as np
import pandas as pd

from climate_indices import indices
from climate_indices import compute  # 包含计算SPI的包

# %% 获取某一路径下特定格式的文件
def get_file(
        inpath: str,
        type_str: str
        ) -> list:
    """
    (1) 功能:
        1) 获取某一路径下特定格式的文件
    ----------
    
    (2) 输入参数
        1) inpath: str
           文件存储绝对路径
        2) type_str: str
           文件后缀名
    ----------
      
    (3) 输出参数
        1) file_list: list
           特定文件格式的数据
           
    """
    file_items = os.listdir(inpath)
    
    file_list = []
    file_path_list = []
    for ii in file_items:
        if ii.endswith(type_str):
            file_list.append(ii)
            file_path_list.append(inpath+ii)
    return file_list,file_path_list

# %% 数据读取函数定义
def read_oridata(
        filepath: str
        ):
    
    """
    (1) 功能:
        读取用于计算SPI的气象数据
        
        注:此函数读取的是测试数据,也可以读取按照相同方式存储的气象数据
    ---
    
    (2) 输入参数:
        1) filepath: str,输入数存储路径
    ---
    
    (3) 输出参数
        1) sta_id: int,站点号
        2) styr: int, 开始年
        3) edyr: int, 结束年
        4) pre: np.array, 降水
       
    """
    # 数据读取
    climdata = pd.read_csv(filepath)
    
    # 站点号
    sta_id = climdata.Sta_ID[0]
    # 开始年和结束年
    styr = climdata.Year[0]
    edyr = max(climdata.Year)
    # 降水
    pre = np.asarray(climdata.Pre_2020)
    
    return sta_id,styr,edyr,pre
    

# %% 不同时间尺度spi计算函数定义
def dif_scale_spi(
        sta_id: int,
        pre_data: np.array,
        styr: int,
        edyr: int,
        scale: tuple
        ) -> pd.DataFrame:
    
    """
    (1) 功能:
        1) 计算单一站点不同时间尺度的spi
    ---
    
    (2) 输入参数
        1) sta_id: int, 站点号
        2) pre_data: np.array, 降水序列,月值
        3) styr: int, 开始年
        4) edyr: int, 结束年
        5) scale: tuple, spei的时间尺度
    ---
    
    (3) 返回值
        1) spi_df: pd.DataFrame, 不同时间尺度的SPI
           列名:站点号,年,月,不同时间尺度的SPI
           
        注:SPI计算结果中的-99表示无效值
    
    """
    
    # 创建存储计算结果的Dataframe(站点号,年,月,不同时间尺度的SPEI)
      # 创建列名
    scale = sorted(scale)
    scale_list = []
    for scale_temp in scale:
        if scale_temp < 10:
            scale_list.append('Scale_0'+str(scale_temp))
        else:
            scale_list.append('Scale_'+str(scale_temp))
    col_names = ['Sta_ID','Year','Month'] + scale_list
      # 空的数据框的创建
    spi_df = pd.DataFrame(data=[],columns=col_names)
    
    # 不同时间尺度的spi的计算
    for scale_temp in scale:
        spi = indices.spi(values=pre_data,
                    scale=scale_temp, # 时间尺度
                    distribution=indices.Distribution.gamma,
                    periodicity=compute.Periodicity.monthly,
                    data_start_year=styr,
                    calibration_year_initial=styr,
                    calibration_year_final=edyr
                    )
        
        spi[np.isnan(spi)] = -99 # nan转换为-99
        if scale_temp < 10:
            spi_df['Scale_0'+str(scale_temp)]=spi
        else:
            spi_df['Scale_'+str(scale_temp)]=spi
    
    # 站点信息补充
    spi_df['Sta_ID'] = sta_id
    
    # 生成年月序列
    year_list = []
    month_list = []
    
    for year in range(styr,edyr+1):
        for month in range(1,13):
            year_list.append(year)
            month_list.append(month)
    
    spi_df['Year'] = year_list   
    spi_df['Month'] = month_list      
      
    return spi_df
    

# %%
if __name__ == '__main__':
    
# 路径处理和变量预定义
    rootdir = r'E:\05_Study\05_DroughtIndex\03_SPI'
    inpath = rootdir + '\\02_Data\\'
    
    outpath = rootdir + '\\04_Result\\'
    type_str = '.csv'
    
# 文件名称获取
    file_list,file_list_path  = get_file(inpath,type_str)
    
# 逐站点计算SPEI
    ii = 0    
    for file_path_temp in file_list_path:
        sta_id,styr,edyr,pre = read_oridata(file_path_temp)
        
        # %% climate_indices库遇到降水为0时,对数据的处理会出现问题,使结果为NaN,为防止0值影响,将降水0值设置为0.001
        pre[pre==0] = 0.001 
        
        # %% 不同时间尺度SPI的计算
        spi_dif_scale = dif_scale_spi(sta_id,pre,styr,edyr,(1,3,6,9,12))
        
        # %% 结果的写出
        outfile = str(int(sta_id)) + '_SPI.xlsx'
        outfile_path = outpath + outfile
        spi_dif_scale.to_excel(outfile_path,index=False,sheet_name=str(sta_id))
        
        print(str(sta_id)+' has been finished.')
 
    print('Finished.')


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日常刷题之77-组合

题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案 提示&#xff1a;假设 n5,k3 就是需要组合出来&#xff0c;长度3且内容数据是在[1,n]这个区间内的所有可能得组合 同时一个组合里面内个数字只能出现一次&#…

windows grep 安装及使用

1&#xff09;下载地址&#xff1a; Grep for Windows 2&#xff09;选择这个包下载&#xff1a; 3&#xff09; 将D:\Program Files (x86)\GnuWin32\bin目录 加入系统变量&#xff1a; 4&#xff09;grep "ACE_Lock_Adapter" -i * 执行命令如下&#xff1a;

使用Git仓库进行项目代码同步与打包

1. 引言 最近在用友的开发者中心论坛发现好多小伙伴反馈使用 YonStudio 开发工具进行云端项目导入失败的问题&#xff0c;有感于此问题会影响开发小伙伴的开发效率&#xff0c;特编写此文帮助新手小伙伴去规避这类问题的发生。 一直以来&#xff0c;开发者依循惯性思维去依赖…

不会搭建物联网数据平台的老板参考一下吧

搭建牛奶厂的物联网数据平台 对于现代牛奶厂&#xff0c;在数字化时代中&#xff0c;搭建物联网数据平台至关重要。这样的平台基础是建立IOT数据底座平台&#xff0c;它是支撑物联网应用的数据存储和管理基础设施&#xff0c;通常由分布式存储系统、时序数据库集群和存储管理组…

放弃 Rust 选择 Zig,Xata 团队推出 pgzx —— 计划使用 Zig 开发基于 PG 的分布式数据库

Summary Xata 公司在基于 PostgresSQL 开发自己的分布式数据库&#xff0c;出于 Zig 和 C 语言以及 PostgreSQL 的 API 有更好的互操作性的考虑&#xff0c;他们选择了 Zig 而非当红炸子鸡语言 Rust。他们的博客文章中对 pgzx 进行了介绍。让我们来看下他们对 Zig 和 Rust 语言…

学习网络编程No.15【高级IO之多路转接】

引言&#xff1a; 北京时间&#xff1a;2024/3/19/11:16&#xff0c;若是说记忆有克星的话&#xff0c;那么一定是时间。若是说耐心有克星的话&#xff0c;那么一定是人的心态。连续几天睡眠问题&#xff0c;加上环境影响&#xff0c;上篇博客还有部分知识只能放在该篇博客介绍…

面试总结:C++11新特性

对于C11的特性你了解多少&#xff1f;简单说说 - 在语法层面引入统一初始化&#xff08;即列表初始化&#xff09;&#xff0c;那么C11的初始化就可以分为列表初始化和字面值初始化 列表初始化就是使用{}&#xff08;花括号&#xff09;来进行对象、内置基本类型等的初始化 in…

超全整理,软件测试-性能测试流程汇总,看这一篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试&#xf…

这个插件,提供了1000多个在线底图服务!

本文推荐一下QGIS中的热门插件:QuickMapService。目前在QGIS插件市场下载量排名第一,先看下官网的介绍: Easy to use list of services and search for finding datasets and basemaps. 言简意赅,用来添加QGIS底图的插件。 插件安装 打开QGIS自带的插件管理器。 在搜索框中…

学习要不畏难

我突然发现&#xff0c;畏难心是阻碍我成长的最大敌人。事未难&#xff0c;心先难&#xff0c;心比事都难&#xff0c;是我最大的毛病。然而一念由心生&#xff0c;心不难时&#xff0c;则真难事也不再难。很多那些自认为很难的事&#xff0c;硬着头皮做下来的时候&#xff0c;…

黑马鸿蒙学习(3):滑动条

1&#xff09; 滑动条slidebar属性&#xff1a;

MySQL-1.数据库的基本操作

1. 数据库的基本操作 show databases; information_schema&#xff1a;信息图式&#xff0c;存储服务器管理数据库的信息 mysql&#xff1a;存放系统信息&#xff0c;用户名密码等 performance_schema&#xff1a;性能图式 sys&#xff1a;系统文件 1.1 创建数据库-studen…

[STL]priority_queue类及反向迭代器的模拟实现

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a; priority_queue类及反向迭代器 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 向着c&…

【Web应用技术基础】HTML(5)——案例1:展示简历信息

样式&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>展示简历信息…

【微服务】Gateway

文章目录 1.基本介绍官方文档&#xff1a;https://springdoc.cn/spring-cloud-gateway/#gateway-starter1.引出网关2.使用网关服务架构图3.Gateway网络拓扑图&#xff08;背下来&#xff09;4.Gateway特性5.Gateway核心组件1.基本介绍2.断言3.过滤 6.Gateway工作机制 2.搭建Gat…

从姿态估计到3D动画

在本文中&#xff0c;我们将尝试通过跟踪 2D 视频中的动作来渲染人物的 3D 动画。 在 3D 图形中制作人物动画需要大量的运动跟踪器来跟踪人物的动作&#xff0c;并且还需要时间手动制作每个肢体的动画。 我们的目标是提供一种节省时间的方法来完成同样的任务。 我们对这个问题…

超实用!10条JavaScript这20年来增加的新功能?

部门捞人&#xff1a;前端可投&#xff1a;OD软件工程师社会招聘-表单-金数据 在过去的20年里&#xff0c;JavaScript经历了多次更新和升级&#xff0c;引入了许多新功能以增强其表达力、交互性和开发效率。以下是一些显著的新功能&#xff1a; 1.ECMAScript 6 (ES6) &#xf…

【ssh连接】奇奇怪怪报错记录

gitlab配置ssh连接&#xff0c;先跟着教程生成密钥&#xff0c;上传公钥&#xff0c;将服务器信息存入config文件&#xff0c;但是ssh连接超时&#xff0c;很急&#xff0c;想用服务器&#xff0c;各种搜索尝试&#xff0c;搞了两三天别的什么都没干&#xff0c;还是没解决&…

vue脚手架创建项目:账号登录(利用element-ui快速开发)(取消eslint强制格式)(修改端口号)

新手看不懂&#xff0c;老手不用看系列 文章目录 一、准备工作1.1 取消强制格式检查1.2 导入依赖&#xff0c;注册依赖 二、去element-ui官网找样式写Login组件2.1 引用局部组件2.2 运行项目 三、看一下发现没问题&#xff0c;开始修改前端的代码四、修改端口号4.1 修改后端端口…

中国赛道领跑之争:安踏将耐克越甩越远

一双鞋、一件衣服每被穿一次&#xff0c;消费者就会把它背后的品牌和自身的体验联系起来&#xff0c;做出评判。所以&#xff0c;如果说有什么领域能充分展示国产品牌的发展进步&#xff0c;鞋服一定包含在内&#xff0c;尤其是强调专业性的体育运动市场。 一年前的2023年3月&…