2013-12-20 6 views
1

У меня возникли трудности с экспортом данных из GrADS в CSV-файл, хотя это должно быть очень просто. Этот файл относится к проекту APHRODITE, касающемуся осадков в Азии. В принципе, я могу прочитать этот файл в GrADS с помощью:Как я могу экспортировать данные из GrAD в CSV-файл или из NetCDF в .csv?

open d:/aphro/aphro.ctl 

и он говорит мне, что:

Data file d:/aphro/APHRO_MA_025deg_V1101R2.%y4 is open as file 1 
Lon set to 60.125 149.875 
Lat set to -14.875 54.875 
Lev set to 1 1 
Time values set: 1961:1:1:0 1961:1:1:0 
E set to 1 1 

Если я выполняю:

q ctlinfo 

также говорит мне, что у меня есть три переменные :

precip 1 0 daily precipitation analysis 
rstn 1 0 ratio of 0.05 degree grids with station 
flag 1 0 ratio of 0.05 degree grids with snow 

Хорошо, теперь все Я хочу сделать, это создать список в файле .csv (или .txt) со следующей информацией:

Precipitation Lon Lat Time(date) 

Это звучит очень просто, но я просто не могу это сделать. Один из способов заключается в использовании:

fprintf precip d:/output.csv %g 1 

Это дает мне файл .csv с целыми данными этого дня в одну длинную колонку (что я хочу). Я также могу сделать то же самое для lon и lat в разных файлах и объединить их. Проблема в том, что для выходного файла это занимает целую вечность - это намного быстрее, если вы не возражаете против множества столбцов, но это становится болью для управления. В принципе, этот метод слишком медленный.

Другой метод, чтобы экспортировать данные в файл NetCDF по:

Set sdfwrite -4d d:/output.nc 
define var = precip 
sdfwrite precip 

Это тогда очень быстро записывает файл с именем output.nc, который содержит все данные мне нужно. Используя R, я могу читать все переменные отдельно, например.

f <- open.ncdf("D:/aphro/test.nc") 
A <- get.var.ncdf(nc=f,varid="time") 
B <- get.var.ncdf(nc=f,varid="rain") 
D <- get.var.ncdf(nc=f,varid="lon") 
E <- get.var.ncdf(nc=f,varid="lat") 

Но то, что я хочу, чтобы выходной файл, где каждая строка говорит мне время, количество дождя, Lon и лат. Я пробовал rbind, но он не связывает правильное время (дату) с правильной суммой дождя и аналогичным образом испортит lon и lat, поскольку есть сотни тысяч данных о дожде, но только несколько дат и только 360 lon points и 280 (т.е. данные о дожде - это сетка данных за каждый день в течение нескольких дней). Я уверен, что это должно быть легко, но как это сделать?

Пожалуйста, помогите

Тони

+0

Я также работаю с файлами NetCDF (данные о дождевых осадках от TRMM ...) Я создал ** STFDF ** файлы из ** ** пространства-времени ** через ** растровые ** пакеты ** кирпичные ** функции , Дает мне полную пространственную и временную гибкость и прост в обращении и т. Д. Извините, бит, я не могу написать пример прямо сейчас –

+0

попробуйте cbind (expand.grid (get.var.ncdf (nc = f, varid = "lon "), get.var.ncdf (nc = f, varid =" lat "), get.var.ncdf (nc = f, varid =" time ")), get.var.ncdf (nc = f, varid = "rain")), но без лучшего описания файла мы можем только догадываться. – mdsumner

+0

Для справки я решил это с помощью метода cbind и get.var.ncdf. Прежде всего, я установил время в градах, используя: set t 1 365, то есть данные первого года, и вывел его с помощью sdfwrite. Используя R и загружая библиотеку NCDF, я использовал get.var.ncdf для чтения переменной, долготы и широты. Затем я расширил сетку lon и lat с помощью cbind (expand.grid (lon, lat)), а также расширил переменную, т. Е. Expand.grid (переменная). Затем я выбрал одну ценность из переменной и объединил ее с данными lon, lat с помощью cbind снова - и повторялся для каждого дня. – user2901667

ответ

5

До моего знания, вы можете изменить ГРАД файл в NetCDF файл с помощью оператора данных климата и R вместе. Подробности можно найти here. Далее файл NetCDF можно преобразовать в CSV-файл. Для этого я предоставляю фиктивный код.

library(ncdf) 
nc <- open.ncdf("foo.nc")    #open ncdf file and read variables 
lon <- get.var.ncdf(nc, "lon")   # Lon lat and Time 
lat <- get.var.ncdf(nc, "lat") 
time <- get.var.ncdf(nc, "time") 
dname <- "t"       # name of variable which can be found by using print(nc) 
nlon <- dim(lon) 
nlat<- dim(lat) 
nt<- dim(time) 
lonlat <- expand.grid(lon, lat) # make grid of given longitude and latitude 
mintemp.array <- get.var.ncdf(nc, dname) 
dlname <- att.get.ncdf(nc, dname, "long_name") 
dunits <- att.get.ncdf(nc, dname, "units") 
fillvalue <- att.get.ncdf(nc, dname, "_FillValue") 
mintemp.vec.long <- as.vector(mintemp.array) 
mintemp.mat <- matrix(mintemp.vec.long, nrow = nlon * nlat, ncol = nt) 
mintemp.df <- data.frame(cbind(lonlat, mintemp.mat)) 
options(width = 110) 
write.csv(mintemp.df, "mintemp_my.csv") 

Надеюсь, это объяснит ваш вопрос.

 Смежные вопросы

  • Нет связанных вопросов^_^