R语言spei包计算标准化降水蒸散指数

R语⾔spei包计算标准化降⽔蒸散指数
编程⼩⽩近⼀星期的研究,⾛了不少弯路,⼀开始想要不⾃⼰写⼀下如何计算SPEI,实在是太⾼看⾃⼰编程⼩⽩的能⼒了,接下来⾃然不了了之了,后来后来,还是直接将R包拿来⽤吧。。
image
image
看完原理之后就基本可以调⽤R包了,⾸先需要安装SPEI包,install.package("SPEI")就ok了,Rstidio⾃动进⾏下载并安装。R包的spei包⾮常简便,可以直接拿来调⽤,建议改过程还是要参看官⽅帮助⽂档,讲解的很清楚也有简单实例。
其中计算PET潜在蒸散时,R包提供三种计算⽅法,分别是thornthwaite(),hargreaves(),penman().其中第⼀种⽅法最为简单,仅需要温度和纬度(单位:°)作为输⼊数据即可。以此准备数据:
数据准备
(1)温度数据,每⼀个站点按列排列,依次为开始年份的12个⽉,后⼀年的12个⽉,以此类推,简单来说就是⼀个站点所有年份⼀列数据,类似这个样⼦,格式是要保存为以空格分割的csv⽂件或txt⽂件,下同
image
(2)纬度数据
焊接技术
image
(3)降⽔数据(格式同温度数据格式)
准备完毕数据之后,就开始直接计算啦,话不多说,直接上代码. 该代码不是直接输出最终结果spei值,有输出的每⼀步结果,需要键⼊的路径可能⽐较多,⼩⽩的代码可能⽐较笨拙(为了⾃⼰好理解),仅供参考。
library(SPEI)
# ===========读⼊数据
# 降⽔数据
prec = read.table('G:\\test\\test3\\',header = T)
# 温度数据
temp = read.table('G:\\test\\test3\\',header = T)
# 每⼀个站点对应的纬度数据
lat = read.table('G:\\test\\test3\\',header = T)
# 输出路径
print(ncol(temp))
print(ncol(prec))
# ==========================================计算PET 本代码采⽤thornthwaite⽅法计算,只需要温度数据
# 利⽤cbind函数将每⼀列连接,就需要初始化⼀列
PET_1 = thornthwaite(temp[,1],lat[,1])
for (i in 2:ncol(temp))
{
PET = thornthwaite(temp[,i],lat[,i])
PET_1 = cbind(PET_1,PET)
}
write.table(PET_1,"G:\\test\\test3\\PET\\PET_station1.csv",sep = ',' ,row.names = FALSE)
# 到此保存的csv的列名均相同,需进⾏合并后⼿动更改
# ==========================================计算⽔平衡
PET = read.table("G:\\test\\test3\\PET\\",header = T)
balance = prec[,1]-PET[,1]
for (j in 2:ncol(prec))
{海云坦克
印顺balance1 = prec[,j]-PET[,j]
balance = cbind(balance,balance1)
}
write.table(balance,"G:\\test\\test3\\PET\\waterbalance_station.csv",sep = ",",row.names = FALSE)
# 到此保存的csv的列名均相同,需进⾏合并后⼿动更改
# ========================================= 计算SPEI
library(SPEI)
2020中央开始禁止基督教water_bal = read.table("G:\\test\\test3\\PET\\",header = T)
spei12 = spei(water_bal[,1], 12)
print(spei12)
# write.csv(spei12$fitted,"D:\\spei1.csv",row.names = F)
print(ncol(water_bal))
# # 因为spei的输出格式没有明⽩,下列保存⽅法出错
# for(k in 2:ncol(water_bal))
# {
#  spei1 = spei(water_bal[,k], 12)
#  spei12 = cbind(spei12,spei1)
#  write.table(spei12$fitted,"D:\\spei1.csv",row.names = F)
# }
# # 采⽤该⽅法将每⼀个站点的spei单独输出成独⽴的csv⽂件,较⿇烦,后续需要将独⽴的csv⽂件合并
output = "G:\\test\\test3\\PET\\spei\\spei"
for(k in 1:ncol(water_bal))
{
spei1 = spei(water_bal[,k], 12)
output1 = paste(k,".csv",sep='')
write.table(spei1$fitted,paste(output,output1,sep=''),row.names = F)  # 到此所有csv的列名均为water_bal[,k],需进⾏合并后⼿动更改
}
rbf神经网络# # 将采⽤上述⽅法得到的独⽴的站点spei+编号的csv⽂件按列合并,编号要⼿动更改,推荐⽤total commander,
#  ⽐如上述得到的⽂件夹命名序号为800,程序读进的顺序则会是1,10,11,19,100,101这样的顺序,我将名称均改为三位的,如001,002,003 input_dir = "G:\\test\\test3\\PET\\spei\\"
file = list.files(input_dir)
dir = paste(input_dir,file,sep="")
n = length(dir)
merge_data = read.csv(dir[1],header = T)
for (i in 2:n){
精绝国new.data = read.csv(dir[i], header=T)
merge_data = cbind(merge_data,new.data)
}
write.csv(merge_data,file = "D:\\spei.csv",row.names=F)

本文发布于:2024-09-22 01:33:58,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/274834.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   需要   温度   计算   开始   保存
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议