爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 14142|回复: 6

[经验总结] 用python计算极端r95极端降水

[复制链接]

新浪微博达人勋

发表于 2021-11-4 11:41:49 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 徵言片羽 于 2021-11-4 12:00 编辑

# 利用小时降水数据,统计西南五省市78个站点1981-2017年极端降水的频数和强度
# 西南五省市78个站点
import numpy as np
import math

#定义一个百分比函数,得到任意分位大于0小于2000的排位后的百分位数
#define a percentile function
def quantile_p(data:list, p):
    data.sort()
    ndata = []
    for i in data:
        if i>0 and i<2000:
            ndata.append(i)
    q = np.percentile(ndata,p)
    #print(ndata)
    return q

st1 = [56144,56146,56172,56178,56182,56196,56247,56251,56287,56374,\
     56385,56444,56459,56462,56475,56479,56485,56492,56533,56548,\
     56571,56586,56651,56664,56671,56684,56691,56739,56748,56751,\
     56763,56768,56778,56786,56793,56856,56872,56875,56886,57206,\
     57237,57306,57313,57328,57348,57405,57426,57432,57516,57606,\
     57614,57633,57647,57707,57718,57722,57729,57731,57741,57803,\
     57806,57816,57825,57832,57839,57902,57906,57910,57916,57922,\
     57932,57947,59007,59021,59023,59027,59046]
st = [56385]
dir  = 'D:/data/hourly_precip/1981-2017/PRE_hourly_'
endf = '.txt'
#prc = [] #设置空列表,存放降水值
fout = open('./PRE_hourly_frequency_itensity.txt','w')
for i in range(0,len(st)):
    filename = dir+str(st)+endf  #拼接构造文件绝对路径
    #print(filename)
    '''下面两行代码将多维数组转换为一维列表
     mulArrays = [[1,2,3],[4,5,6],[7,8,9]]
     list(np.array(mulArrays).flatten())
    '''
    #1.读取站点和经纬度信息
    fp = open(filename,'r')     #打开小时降水数据
    lines = fp.readlines()
    l1 = lines[0]
    stid = int(l1.split( )[0])      #站点信息
    lat  = int(l1.split( )[1])     #纬度,单位:度,分
    latitude = math.modf(lat/100)[1] + math.modf(lat/100)[0]*100/60  #纬度,单位:度

    #print('stid:',stid,'latitude:',latitude)
    lon  = int(l1.split( )[2])      #经度,单位:度,分
    longitude= math.modf(lon/100)[1] + math.modf(lon/100)[0]*100/60  #经度,单位:度


    #2.计算r95,r99等
    percent = 95  #极端降水指数,1-100任意值,但
    a = np.loadtxt(filename)    #将文本数据读入矩阵
    b = a[:,7:31]               #小时降水数据,7-31列,m*24维
    prc = list(np.array(b).flatten())  #矩阵转换为一维列表
    prc.sort()                  #列表排序
    rp = quantile_p(prc,percent)    #引用百分比函数计算当前站点降水r95阈值
    rp_prc = rp/10  #r95的真实阈值,单位mm

    #3.统计r95降水的频率frequency,用一维矩阵prc和r95的大小来判断
    n = 0
    for p in prc:
        if p>=rp:
            n+=1
    print('stid:',stid,'latitude:%.2f'%latitude,'longitude:%.2f'%longitude,'r95p:%smm'%rp,'frequency:',n)

PRE_hourly_56385.txt

1.58 MB, 下载次数: 37, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2021-11-4 11:46:35 | 显示全部楼层
最近在做极端降水,需要计算r95,无奈没有现成现成脚本,就自己写了一个,供大家参考。重点就在于使用math自带的percentile函数,自己构造一个函数,函数对列表进行排序,选择其中大于0小于2000的数据,输出为新列表,再用math.percentile函数计算任意分位数,可以计算r95,r99等。不足和错误之处请斧正。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-11-4 12:41:18 | 显示全部楼层
厉害了,学习学习
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-11-4 14:14:00 | 显示全部楼层
顶顶 最近用NCL也做了极端指数 学习下
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-11-4 20:41:32 | 显示全部楼层
学习啦
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-11-8 09:14:19 | 显示全部楼层
码住学习
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2022-5-24 12:19:51 | 显示全部楼层
你好,我想问下为什么要选择其中大于0小于2000的数据呢。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表