R气象数据批处理


R语言批处理中国地面气候资料日值数据集(V3.0)本文的处理数据、说明文档以及脚本,在这儿👇

:m:

一、数据内容结构简介

以月为单位,每个文件代表一个月,每个文件中包括所有站点的详细数据(可能是全国的气象站点)

“中国地面气候资料日值数据集(V3.0)”包含了中国699个基准、基本气象站1951年1月以来本站气压、气温、降水量、蒸发量、相对湿度、风向风速、日照时数和0cm地温要素的日值数据。

如图,

其中各列含义依次为

“站点”,”纬度”,”经度”,”海拔”, “年”,”月”,”日”,”平均气温”, “最大气温”,”最小气温”

二、所要实现的效果

源数据是以月为单位,月文件下包含各个站点信息。

所要实现的效果是,以站点为单位,每个站点为一独立文件,该文件下包括各月数据。

本次要单独提出几个站点数据,代号为50136,51470,52602,54351的站点,即每个月文件下的第一列数据。

若要提取所有数据,代码更改部分下文已有简单说明

ps:平均、最大、最小气温数据需要进行单独处理,除10.

最终效果图示:

三、R脚本实现

3.1 初级版本——部分指定站点处理

rm(list = ls())
setwd("B:/Temp3/test")

#筛选出所有数据文件,以“SURF_CLI_CHN_MUL_DAY-TEM”为搜索关键词----
flies=list.files(pattern = "SURF_CLI_CHN_MUL_DAY-TEM")
#检索每一个文件内容----------------------------------------------
for (flie in 1:length(flies)) {
  data<-read.table(file = flies[flie])
  #将数据按照V1列分组(站点列)
  sites=split(data,f=data$V1)
  #定义所需站点数组,若要提取所有数据,只需更改此处,以及site
  #即以下三列,for控制改为length(sites)
  partldata=c(50136,51470,52602,54351)
  for (i in partldata) {
    #单独一个站点的数据(dataframe格式)
    site=data.frame(sites[[paste(i)]])
    write.table(site[,1:10],#只取前10列
                paste(sites[[paste(i)]][1,1],
                      "站点.csv"),#文件名
                sep = "," ,#以“,”分割才能有正常格式,很迷
                append = T,#每个文件(每个月份)的数据都依次追加
                row.names = F,
                col.names = F)
    print(paste(i,"完成"))
  }
  print("Yeah! 又完成了一个文件")
}
print("Good!")

#为其添加列名,并处理气温数据-------------------------------------
#搜索出完成的文件,以“5”开头、“.csv”为结尾为特征搜索
data5=list.files(pattern = "5*.csv$")
for (j in 1:length(data5)) {
  datacsv=read.csv(data5[j],header = F)
  names(datacsv)<-c("站点","纬度","经度","海拔",
                    "年","月","日","平均气温",
                    "最大气温","最小气温") 
  #datacsv$平均气温<-datacsv$平均气温/10
  #datacsv$最大气温<-datacsv$最大气温/10
  #datacsv$最小气温<-datacsv$最小气温/10
  write.table(datacsv,
              paste(data5[j]),
              sep = "," ,
              append=F,
              row.names = F)
}

3.2 终极版本——全部站点处理


rm(list = ls())
setwd("B:/Temp3/test1")

#筛选出所有数据文件,以“SURF_CLI_CHN_MUL_DAY-TEM”为搜索关键词----
flies=list.files(pattern = "SURF_CLI_CHN_MUL_DAY-TEM")
flies
#检索每一个文件内容----------------------------------------------
for (flie in 1:length(flies)) {
  data<-read.table(file = flies[flie])
  #将数据按照V1列分组(站点列)
  sites=split(data,f=data$V1)

  for (i in 1:length(sites)) {
    #单独一个站点的数据(dataframe格式)
    site=data.frame(sites[i])
    write.table(site[,1:10],#只取前10列
                paste(sites[[i]][1,1],
                      "站点.csv"),#文件名
                sep = "," ,#以“,”分割才能有正常格式,很迷
                append = T,#每个文件(每个月份)的数据都依次追加
                row.names = F,
                col.names = F)
    print(sites[[i]][1,1])
  }
  print("Yeah! 又完成了一个文件")
}
print("Good!")

#为其添加列名,并处理气温数据-------------------------------------
#搜索出完成的文件,以“5”开头、“.csv”为结尾为特征搜索
data5=list.files(pattern = "5*.csv$")

for (j in 1:length(data5)) {
  datacsv=read.csv(data5[j],header = F)
  #names(datacsv)<-c("站点","纬度","经度","海拔",
  #                  "年","月","日","平均气温",
  #                  "最大气温","最小气温") 
  datacsv$V8<-datacsv$V8/10
  datacsv$V9<-datacsv$V9/10
  datacsv$V10<-datacsv$V10/10

  write.table(datacsv,
              paste(data5[j]),
              sep = "," ,
              append=F,
              row.names = F,
              col.names=F
              )
}

P.S. 代码后期做了微小的调整。

①对经纬度进行除100

②对三个气温进行除10

③去掉了加入列名代码,因为后期处理不方便

终极版本运行环境如下(包含运行结果)

环境下为各个气象TXT文件,运行各个站点文件则直接放在该目录下。


3.3 他山之石

1、很清晰,不过用的方法一样

不过环境得稍改一下

rm(list=ls())
setwd("B:/Temp3/")

file <- list.files('TEM', full.names = T)

for(i in 1:length(file))
{
  df <- read.table(file[i])
  df <- df[,1:10]
  out <- split(df, f = df$V1)
  for(j in 1:length(out))
  {
    ddf   <- out[[j]]
    id    <- ddf[1,1]
    path  <- paste(id, '.txt', sep = "")
    write.table(ddf, path, append = T, row.names = F, col.names = F, sep = ' ')
  }
  print(i)
}

2、另一种~,也很棒!

rm(list=ls())
setwd("B:/Temp3/test")

flies=list.files(pattern = "SURF_CLI_CHN_MUL_DAY-TEM")
firstflie<-read.table('SURF_CLI_CHN_MUL_DAY-TEM-12001-201101.TXT')
getnum<-firstflie$V1#提取所有站点

getnum<-getnum[!duplicated(getnum)]#重复数据删除

for(j in getnum)
{
  name<-paste(as.character(j),".txt",sep="")
  #vcsv<-paste(as.character(j),".csv",sep="")
  for(i in 1:length(files))
  {
    df_single <- read.table(files[i])#每一个文件
    sdf<- subset(df_single, V1 == j) #分割文件,方法:将v1列的值与每一个站点匹配。
    sdf<- sdf[,1:10]#只取前十列
    write.table(sdf, name, append = T, col.names = F, row.names = F)
  }
  print(name)
}

四、统计各站点所有年月份的气温总和shp输出

运行环境

在以上处理结果的基础上,对各个分开的各个站点进行汇总统计。

具体来说,也就是,在步骤三的基础上👇(所有的站点)

已经生成好了所有的站点文件。其中,result文件夹为存放结果数据。

代码实现

rm(list = ls())
setwd("B:/Temp3/test1")
#导包-----------------------------------------------------
library(maptools)
library(rgdal)
library(sp)
#读取数据--------------------------------------------------
data5=list.files(pattern = "5*.csv$")
#汇总数据-------------------------------------------------
for (j in 1:length(data5)) {
   datacsv=read.csv(data5[j],header = F)
   id=datacsv[1,1]
   longitude=datacsv[1,2]
   latitude=datacsv[1,3]
   SumTem=sum(datacsv[,8])#计算该站点所有年月份的气温总和
   datacsv=matrix(c(id,longitude,latitude,SumTem),1)
   write.table(datacsv,
              "result/sitelocation.csv",
              sep = "," ,
              append=T,
              row.names = F,
              col.names = F)
}
#添加列名----------------------------------------------------
resultdata=read.csv("result/sitelocation.csv",header = F)
names(resultdata)<-c("site","Lat","Lon","tem")
write.table(resultdata,"result/sitelocation.csv",sep = "," ,append=F,row.names = F)
#生成shp文件-------------------------------------------------
resultdata=read.csv("result/sitelocation.csv",header = T)
coordinates(resultdata)<-~Lon+Lat
proj4string(resultdata)<-CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
writeOGR(resultdata,
         dsn = "B:/Temp3/test1/result",#设置输出路径
         layer = "result",#设置保存名称
         driver = "ESRI Shapefile",#设置输出类型
         overwrite_layer = T) #是否覆盖)

proj4坐标系网站:

P.S 生成shp文件时,尽量不要用汉字列名不要用汉字不要用汉字~

特别是设置其坐标参考系参数的时候~

结果环境及成果

运行汇总的所有气温数据均放在一个csv中,并将shp文件放在同目录下,运行结果环境如下👇

shp文件

:sunny::sunny::sunny:

WelcomToMyBlog

欢迎光临我的网站:https://lishiyu.vip


文章作者: 李世昱
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 李世昱 !
评论
  目录