在Matlab中提取每个lat/long的netCDF时间序列

在Matlab中提取每个lat/long的netCDF时间序列,matlab,netcdf,Matlab,Netcdf,我目前正在使用气候模型的netCDF输出,并希望获得netCDF中每个纬度/经度组合的时间序列文本文件。例如,如果netCDF有10个纬度和10个经度,我将获得100个文本文件,每个文件都有一个列格式的时间序列。我对Matlab/netCDF语言相当熟悉,但我似乎无法理解这一点。命名文本文件并不重要;我将它们重命名为“latitude\u longide\u PCP.txt”,其中PCP是纬度和经度位置的降水量 任何帮助都将不胜感激。谢谢 --Darren有几种方法可以解决这个问题 方法1。如果

我目前正在使用气候模型的netCDF输出,并希望获得netCDF中每个纬度/经度组合的时间序列文本文件。例如,如果netCDF有10个纬度和10个经度,我将获得100个文本文件,每个文件都有一个列格式的时间序列。我对Matlab/netCDF语言相当熟悉,但我似乎无法理解这一点。命名文本文件并不重要;我将它们重命名为“latitude\u longide\u PCP.txt”,其中PCP是纬度和经度位置的降水量

任何帮助都将不胜感激。谢谢


--Darren有几种方法可以解决这个问题

方法1。如果能够将netcdf文件放在THREDD数据服务器上,则可以使用netcdf子集服务网格作为点来指定经度/纬度点,并以CSV或XML格式获取数据。以下是Unidata的THREDD数据服务器的一个示例:

方法2。如果您想使用Matlab提取特定经度/纬度位置的时间序列,可以使用NCTOOLBOX中的“nj_tseries”函数,可从以下网址获得:

方法3。如果您真的想使用Matlab在[time,lon,lat]网格中的每个i,j位置编写ASCII时间序列,您可以这样做(使用NCTOOLBOX):


如果您有足够的内存将所有数据读取到matlab中,您可以读取双循环之外的数据,这将快得多。但无论如何,ASCII的编写速度很慢,所以可能没那么重要。

有几种方法可以解决这个问题

%% 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));
方法1。如果能够将netcdf文件放在THREDD数据服务器上,则可以使用netcdf子集服务网格作为点来指定经度/纬度点,并以CSV或XML格式获取数据。以下是Unidata的THREDD数据服务器的一个示例:

方法2。如果您想使用Matlab提取特定经度/纬度位置的时间序列,可以使用NCTOOLBOX中的“nj_tseries”函数,可从以下网址获得:

方法3。如果您真的想使用Matlab在[time,lon,lat]网格中的每个i,j位置编写ASCII时间序列,您可以这样做(使用NCTOOLBOX):


如果您有足够的内存将所有数据读取到matlab中,您可以读取双循环之外的数据,这将快得多。但无论如何,编写ASCII很慢,所以可能没那么重要。

想知道为什么要将它们放在单独的文件中。您的分析一次只能处理一个时间序列的大数据(与您机器上的ram相比)吗?我正在提取单独的时间序列,以便将它们输入到水文模型中,该模型使用lat/long的天气时间序列。我想知道您为什么要将它们放在单独的文件中。您的分析一次只能处理一个时间序列的大数据(与您机器上的ram相比)吗?我正在提取单独的时间序列,以便将它们输入到水文模型中,该模型使用lat/long的天气时间序列。
%% 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));