我想使用R中的循环提取多个netcdf文件。

huangapple go评论87阅读模式
英文:

I want to extract multiple netcdf files using loop in R

问题

我想在R中使用循环提取多个NETCDF文件。我已经编写了单个文件的代码,但卡在了如何将循环应用到这段代码上。请帮忙。

  1. nc_fname <- "1981_01_20_25.nc"
  2. nc_ds <- nc_open(nc_fname)
  3. dim_lon <- ncvar_get(nc_ds, "longitude")
  4. dim_lat <- ncvar_get(nc_ds, "latitude")
  5. dim_time <- ncvar_get(nc_ds, "time")
  6. t_units <- ncatt_get(nc_ds, "time", "units")
  7. t_ustr <- strsplit(t_units$value, " ")
  8. t_dstr <- strsplit(unlist(t_ustr)[3], "-")
  9. date <- ymd(t_dstr) + dhours(dim_time)
  10. date
  11. coords <- as.matrix(expand.grid(dim_lon, dim_lat, date))
  12. var1 <- ncvar_get(nc_ds, "mn2t", collapse_degen=FALSE)
  13. var2 <- ncvar_get(nc_ds, "mx2t", collapse_degen=FALSE)
  14. var3 <- ncvar_get(nc_ds, "t2m", collapse_degen=FALSE)
  15. var4 <- ncvar_get(nc_ds, "slt", collapse_degen=FALSE)
  16. var5 <- ncvar_get(nc_ds, "swvl1", collapse_degen=FALSE)
  17. var6 <- ncvar_get(nc_ds, "u10", collapse_degen=FALSE)
  18. var7 <- ncvar_get(nc_ds, "e", collapse_degen=FALSE)
  19. var8 <- ncvar_get(nc_ds, "ro", collapse_degen=FALSE)
  20. var9 <- ncvar_get(nc_ds, "tp", collapse_degen=FALSE)
  21. var10 <- ncvar_get(nc_ds, "lai_hv", collapse_degen=FALSE)
  22. var11 <- ncvar_get(nc_ds, "lai_lv", collapse_degen=FALSE)
  23. nc_df <- data.frame(cbind(coords, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11))
  24. names(nc_df) <- c("lon", "lat", "time", "Mintemp", "Maxtemp", "Temp", "SoilType", "SoilVol_1",
  25. "Wind", "Evap", "Runoff", "Prec", "LAI_H", "LAI_L")
  26. csv_fname <- "netcdf_filename.csv"
  27. write.csv(nc_df, "1981_01_20_25.csv")

我已经尝试过修改它,但没有成功。

英文:

I want to put extract multiple NETCDF files using loop in R. The code I have made is for single file but I am stuck to apply loop for this code. Need help please.

  1. nc_fname &lt;- &quot;1981_01_20_25.nc&quot;
  2. nc_ds &lt;- nc_open(nc_fname)
  3. dim_lon &lt;- ncvar_get(nc_ds, &quot;longitude&quot;)
  4. dim_lat &lt;- ncvar_get(nc_ds, &quot;latitude&quot;)
  5. dim_time &lt;- ncvar_get(nc_ds, &quot;time&quot;)
  6. t_units &lt;- ncatt_get(nc_ds, &quot;time&quot;, &quot;units&quot;)
  7. t_ustr &lt;- strsplit(t_units$value, &quot; &quot;)
  8. t_dstr &lt;- strsplit(unlist(t_ustr)\[3\], &quot;-&quot;)
  9. date &lt;- ymd(t_dstr) + dhours(dim_time)
  10. date
  11. coords &lt;- as.matrix(expand.grid(dim_lon, dim_lat, date))
  12. var1 &lt;- ncvar_get(nc_ds, &quot;mn2t&quot;, collapse_degen=FALSE)
  13. var2 &lt;- ncvar_get(nc_ds, &quot;mx2t&quot;, collapse_degen=FALSE)
  14. var3 &lt;- ncvar_get(nc_ds, &quot;t2m&quot;, collapse_degen=FALSE)
  15. var4 &lt;- ncvar_get(nc_ds, &quot;slt&quot;, collapse_degen=FALSE)
  16. var5 &lt;- ncvar_get(nc_ds, &quot;swvl1&quot;, collapse_degen=FALSE)
  17. var6 &lt;- ncvar_get(nc_ds, &quot;u10&quot;, collapse_degen=FALSE)
  18. var7 &lt;- ncvar_get(nc_ds, &quot;e&quot;, collapse_degen=FALSE)
  19. var8 &lt;- ncvar_get(nc_ds, &quot;ro&quot;, collapse_degen=FALSE)
  20. var9 &lt;- ncvar_get(nc_ds, &quot;tp&quot;, collapse_degen=FALSE)
  21. var10 &lt;- ncvar_get(nc_ds, &quot;lai_hv&quot;, collapse_degen=FALSE)
  22. var11 &lt;- ncvar_get(nc_ds, &quot;lai_lv&quot;, collapse_degen=FALSE)
  23. nc_df &lt;- data.frame(cbind(coords, var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11))
  24. names(nc_df) &lt;- c(&quot;lon&quot;, &quot;lat&quot;, &quot;time&quot;, &quot;Mintemp&quot;, &quot;Maxtemp&quot;,&quot;Temp&quot;,&quot;SoilType&quot;,&quot;SoilVol_1&quot;,
  25. &quot;Wind&quot;,&quot;Evap&quot;,&quot;Runoff&quot;,&quot;Prec&quot;,&quot;LAI_H&quot;,&quot;LAI_L&quot;)
  26. csv_fname &lt;- &quot;netcdf_filename.csv&quot;
  27. write.csv(nc_df, &quot;1981_01_20_25.csv&quot;)

I have tried to modified it but its not working.

答案1

得分: 0

以下是翻译好的部分:

  1. 如果您可以使用 `dir()` `list.files()` 创建一个包含所有文件名的列表,您可以在第一步和最后一步中像这样索引这些文件:
  2. setwd("YOUR/WORKING/DIRECTORY")
  3. FilesList <- dir(pattern="\\.nc$")
  4. for(i in 1:length(FilesList)){
  5. nc_fname <- FilesList[i]
  6. nc_ds <- nc_open(nc_fname)
  7. dim_lon <- ncvar_get(nc_ds, "longitude")
  8. dim_lat <- ncvar_get(nc_ds, "latitude")
  9. dim_time <- ncvar_get(nc_ds, "time")
  10. t_units <- ncatt_get(nc_ds, "time", "units")
  11. t_ustr <- strsplit(t_units$value, " ")
  12. t_dstr <- strsplit(unlist(t_ustr)[3], "-")
  13. date <- ymd(t_dstr) + dhours(dim_time)
  14. date
  15. coords <- as.matrix(expand.grid(dim_lon, dim_lat, date))
  16. var1 <- ncvar_get(nc_ds, "mn2t", collapse_degen=FALSE)
  17. var2 <- ncvar_get(nc_ds, "mx2t", collapse_degen=FALSE)
  18. var3 <- ncvar_get(nc_ds, "t2m", collapse_degen=FALSE)
  19. var4 <- ncvar_get(nc_ds, "slt", collapse_degen=FALSE)
  20. var5 <- ncvar_get(nc_ds, "swvl1", collapse_degen=FALSE)
  21. var6 <- ncvar_get(nc_ds, "u10", collapse_degen=FALSE)
  22. var7 <- ncvar_get(nc_ds, "e", collapse_degen=FALSE)
  23. var8 <- ncvar_get(nc_ds, "ro", collapse_degen=FALSE)
  24. var9 <- ncvar_get(nc_ds, "tp", collapse_degen=FALSE)
  25. var10 <- ncvar_get(nc_ds, "lai_hv", collapse_degen=FALSE)
  26. var11 <- ncvar_get(nc_ds, "lai_lv", collapse_degen=FALSE)
  27. nc_df <- data.frame(cbind(coords, var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11))
  28. names(nc_df) <- c("lon", "lat", "time", "Mintemp", "Maxtemp","Temp","SoilType","SoilVol_1",
  29. "Wind","Evap","Runoff","Prec","LAI_H","LAI_L")
  30. csv_fname <- "netcdf_filename.csv" ## 我不确定您是否需要这一行,它不会再次被调用
  31. write.csv(nc_df, paste0(gsub("\\.nc$","",FilesList[i]),".csv"))
  32. }
英文:

If you can create a list of all of your file names with dir() or list.files(), you can index these files in the first and last steps like this:

  1. setwd(&quot;YOUR/WORKING/DIRECTORY&quot;)
  2. FilesList&lt;-dir(pattern=&quot;\\.nc$&quot;)
  3. for(i in 1:length(FilesList)){
  4. nc_fname &lt;- FilesList[i]
  5. nc_ds &lt;- nc_open(nc_fname)
  6. dim_lon &lt;- ncvar_get(nc_ds, &quot;longitude&quot;)
  7. dim_lat &lt;- ncvar_get(nc_ds, &quot;latitude&quot;)
  8. dim_time &lt;- ncvar_get(nc_ds, &quot;time&quot;)
  9. t_units &lt;- ncatt_get(nc_ds, &quot;time&quot;, &quot;units&quot;)
  10. t_ustr &lt;- strsplit(t_units$value, &quot; &quot;)
  11. t_dstr &lt;- strsplit(unlist(t_ustr)\[3\], &quot;-&quot;)
  12. date &lt;- ymd(t_dstr) + dhours(dim_time)
  13. date
  14. coords &lt;- as.matrix(expand.grid(dim_lon, dim_lat, date))
  15. var1 &lt;- ncvar_get(nc_ds, &quot;mn2t&quot;, collapse_degen=FALSE)
  16. var2 &lt;- ncvar_get(nc_ds, &quot;mx2t&quot;, collapse_degen=FALSE)
  17. var3 &lt;- ncvar_get(nc_ds, &quot;t2m&quot;, collapse_degen=FALSE)
  18. var4 &lt;- ncvar_get(nc_ds, &quot;slt&quot;, collapse_degen=FALSE)
  19. var5 &lt;- ncvar_get(nc_ds, &quot;swvl1&quot;, collapse_degen=FALSE)
  20. var6 &lt;- ncvar_get(nc_ds, &quot;u10&quot;, collapse_degen=FALSE)
  21. var7 &lt;- ncvar_get(nc_ds, &quot;e&quot;, collapse_degen=FALSE)
  22. var8 &lt;- ncvar_get(nc_ds, &quot;ro&quot;, collapse_degen=FALSE)
  23. var9 &lt;- ncvar_get(nc_ds, &quot;tp&quot;, collapse_degen=FALSE)
  24. var10 &lt;- ncvar_get(nc_ds, &quot;lai_hv&quot;, collapse_degen=FALSE)
  25. var11 &lt;- ncvar_get(nc_ds, &quot;lai_lv&quot;, collapse_degen=FALSE)
  26. nc_df &lt;- data.frame(cbind(coords, var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11))
  27. names(nc_df) &lt;- c(&quot;lon&quot;, &quot;lat&quot;, &quot;time&quot;, &quot;Mintemp&quot;, &quot;Maxtemp&quot;,&quot;Temp&quot;,&quot;SoilType&quot;,&quot;SoilVol_1&quot;,
  28. &quot;Wind&quot;,&quot;Evap&quot;,&quot;Runoff&quot;,&quot;Prec&quot;,&quot;LAI_H&quot;,&quot;LAI_L&quot;)
  29. csv_fname &lt;- &quot;netcdf_filename.csv&quot; ## I am not sure you need this line, it doesn&#39;t get called again
  30. write.csv(nc_df, paste0(gsub(&quot;\\.nc$&quot;,&quot;&quot;,FilesList[i]),&quot;.csv&quot;))
  31. }

huangapple
  • 本文由 发表于 2023年2月16日 10:29:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/75467261.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定