2013-05-13 51 views
1

我目前正在使用來自氣候模型的netCDF輸出,並且希望獲得netCDF中每個緯度/經度組合的時間序列的文本文件。例如,如果netCDF有10個緯度和10個經度,我將獲得100個文本文件,每個文本文件具有列格式的時間序列。我對Matlab/netCDF語言相當熟悉,但我似乎無法繞過這一點。命名文本文件並不重要;我會將它們重新命名爲「latitude_longitude_PCP.txt」,其中PCP是經度和緯度的降水量。在Matlab中爲每個緯度/經度組合提取netCDF時間序列

任何幫助,將不勝感激。謝謝。

- 達倫

+0

想知道爲什麼你希望他們在不同的文件。您是否正在處理大量數據(與機器上的內存相比),您的分析一次只能處理一個時間序列? – 2013-05-13 15:05:39

+0

我正在提取單獨的時間序列,以便我可以將它們輸入到水文模型中,該模型使用緯度/經度的天氣時間序列。 – dficklin 2013-05-16 20:52:09

回答

1

有幾種方法可以解決這個問題。方法1.如果您能夠將netcdf文件放在THREDDS數據服務器上,則可以使用NetCDF子集服務網格作爲點來指定經度/緯度點並獲取CSV或XML格式的數據。下面是Unidata的的THREDDS數據服務器的例子:http://thredds.ucar.edu/thredds/ncss/grid/grib/NCEP/GFS/Global_0p5deg/best/pointDataset.html

方法2。如果你想用Matlab在特定的經度/緯度位置,你可以使用來自NCTOOLBOX了「nj_tseries」函數提取時間序列,網址:http://nctoolbox.github.io/nctoolbox/

方法3.如果你真的想在每寫一個ASCII的時間序列我,在你的Ĵ位置[時間,經度,緯度]用Matlab網格,你可以做這樣的事情(使用NCTOOLBOX):

url='http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/Global_2p5deg/best'; 
nc = ncgeodataset(url); 
nc.variables 
var='Downward_Short-Wave_Radiation_Flux_surface_12_Hour_Average'; 
lon = nc.data('lon'); 
lat = nc.data('lat'); 
jd = nj_time(nc,var); 
ncvar = nc.variable(var); 
for j=1:length(lat) 
    for i=1:length(lon) 
     v=ncvar.data(:,j,i); 
     outfile=sprintf('%6.2flon%6.2flat.csv',lon(i),lat(j)) 
     fid=fopen(outfile,'wt') 
     data= [datevec(jd) v] 
     fprintf(fid,'%2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %7.2f\n',data') 
     fclose(fid) 
     disp([outfile ' created.']) 
    end 
end 

如果你有足夠的內存來讀取所有的數據到matlab中,你可以在雙循環之外進行,這會快得多。但是,編寫ASCII碼無論如何都很慢,所以它可能並不重要。

+0

太棒了!這工作完美。 – dficklin 2013-05-13 15:47:42

0
%% Create demo data 
data = reshape(1:20*30*40,[20 30 40]); 
nccreate('t.nc','data','Dimensions',{'lat', 20, 'lon',30, 'time', inf}); 
ncwrite('t.nc', 'data',data); 
ncdisp('t.nc'); 

%% Write timeseries to ASCII files 
% Giving an idea of the size of your data can help people 
% recommend different approaches tailored to the data size. 
% For smaller data, it might be faster to read in the full 
% 3D data into memory 
varInfo = ncinfo('t.nc','data'); 
disp(varInfo); 
for latInd =1:varInfo.Size(1) 
    for lonInd =1:varInfo.Size(2) 
     fileName = ['t_ascii_lat',num2str(latInd),'_lon',num2str(lonInd),'.txt']; 
     tSeries = ncread('t.nc','data',[latInd, lonInd, 1],[1,1,varInfo.Size(3)]); 
     dlmwrite(fileName,squeeze(tSeries)); 
    end 
end 

%% spot check 
act = dlmread('t_ascii_lat10_lon29.txt'); 
exp = squeeze(data(10,29,:)); 
assert(isequal(act,exp));