Madrigal网站
使用的数据来自Madrigal Database,开始在进行大数据处理时会为感叹一一点击下载文件对效率的影响,网站本身有基于MATLAB,Python,IDL的代码进行API,实现大量文件下载,网站Create download advanced script (openmadrigal.org)http://cedar.openmadrigal.org/downloadAdvancedScript
在Select parameters一栏里要选择自己所需的数据,如果不知道所选instrument包含那些数据,可以先下载一个读取看看有什么,或者Select single experiment选择出自己所需文件,然后再Select parameters/filters查看文件包含的数据类型
类似于在进行循环前先检查一下单一的事件,反馈出整体特征
然后首次使用还需要参照网站http://cedar.openmadrigal.org/madrigalDownload
下载第三方库,对Python等要求可参考Installing Madrigal for the first time (mit.edu)
同时网站有介绍如何使用该库,在使用MATLAB时也可慢慢理解这些,在使用时需要确保下载的库在路径中
madurl = 'http://cedar.openmadrigal.org';
cgiurl = getMadrigalCgiUrl(madurl)
%List all instruments, and their latitudes and longitudes
instArray = getInstrumentsWeb(cgiurl);
for i = 1:length(instArray)
[s,errmsg] = sprintf('Instrument: %s, at lat %f and long %f', ...
instArray(i).name, ...
instArray(i).latitude, ...
instArray(i).longitude);
s
end
该函数会列出所有Instrument与经纬度
% list all files in the XXX experiment
startdate = datenum('01/01/2001');
enddate = datenum('12/31/2023');
expArray = getExperimentsWeb(cgiurl, 100, startdate, enddate, 1);
for i = 1:length(expArray)
[s,errmsg] = sprintf('Experiment name: %s, at url %s and id %i', ...
expArray(i).name, ...
expArray(i).url, ...
expArray(i).id);
s
end
列出日期范围内标号为100的instrument的所有文件名与网站,id,其中仪器的代表标号在该网站的生产命令代码(图一)界面选择完成create后可见
% parameters in the last file(end)
parmArray = getParametersWeb(cgiurl, expFileArray(end).name)
for i = 1:10
[s,errmsg] = sprintf('Parameter mnemonic: %s, description "%s" -- isMeasured = %i', ...
parmArray(i).mnemonic, ...
parmArray(i).description, ...
parmArray(i).isMeasured);
s
end
在expFileArray数组中的最后一个文件输出参数的部分信息,遍历前十个参数,输出每个参数的助记符(mnemonic)、描述(description)和是否被测量(isMeasured)的信息
有时会因为文件某参数在某一天为成功记录而记为0,那么我们使用循环读取大量文件也需要留意检查参数存在性,以上代码参考Madrigal网站介绍如何快速上手使用的部分,可在网站查看它所给的例子去对比,达到反馈Working on file /opt/cedar3/experiments/2004/jul/01jan04k/jul20240101_150km.001.hdf5,可判断使用成功
MATLAB读取文件
在使用时因为有参数遗漏,循环读取文件会在某处停止,为方便找出该部分文件并且继续运行最好设有保障,还可以继续优化模型,使用num_days = eomday(year, month); %获取给定年份和月份的天数,从而使用for day = 1:num_days提高效率。
自己还直接尝试在MATLAB上读取文件后直接出图,figure图窗就先出现1000+以上,然后有作图,占用过多资源,后面就使用saveas函数保存成图像,避免打开和渲染大量图形界面୧ ˙Ꙫ˙
for year = 2001:2009
for month = 1:12
for day = 1:31
% XXX为读取的文件名
filename = sprintf('XXX', year, month, day);
% 检查文件是否存在
if exist(filename, 'file') == 2
try
% 尝试读取所需数据,并且文件格式为NC
timestamps = ncread(filename, 'timestamps');
% 将读取到的信息添加到相应的数组中
all_timestamps = vertcat(all_timestamps, timestamps); % 提前写有空数组
catch
% 如果读取参数时出现错误,显示警告并继续下一个文件
warning('An error occurred while reading the file: %s', filename);
continue; % 跳过当前循环,处理下一个文件
end
end
end
end
end