活动温度总和(简称积温)是某一段时间内逐日平均气温≥10℃持续期间日平均气温的总和。是研究温度与生物有机体发育速度之间关系的一种指标,从强度和作用时间两个方面表示温度对生物有机体生长发育的影响。一般以度日(d·℃)为单位。

积温一般使用站点记录的日平均气温进行计算。我国建设有2000余个国家气象站点,最早观测时间至1951。观测数据可在国际气象信息中心申请(中国气象数据网)。这些站点的日值观测数据可以用于积温的计算,图1是站点日尺度气温数据的格式。温度数据共13列,第1列为站点编号,第2、3、4列站点经纬度和海拔高度,第5-7列为观测日期,第8-10列为日平均温、最高温和最低温,11-13列为数据观测状态。

图1. 日观测气温数据格式

积温计算代码

1. 将所有站点数据导入到Matlab中

%% 将所有的温度数据导入到matlab中

%% 选择数据所在的文件夹,获取所有文件信息

clear,clc

% 添加当前路径

addpath(genpath(pwd))

filedir = 'F:\indices_wangjing\tem\*txt';

filenames = dir(filedir);

% 文件保存目录

filedir_save = 'F:\indices_wangjing\tem_mat\';

% 获取文件长度

file_len = length(filenames);

% 逐个文件导入

for ifile = 1:file_len

disp(ifile/file_len);

% 当前文件

filename_this = filenames(ifile).name;

% 获取观测时间

time_obv = filename_this(end-9:end-4);

% 读取当前文件(自定义函数参加第3部分)

sm_singleMonth = importfile_tem_v1(filename_this, 1, inf);

% 纬度转换

lats = sm_singleMonth(:,2);

lats_ = num2str(lats);

lats_D = str2num(lats_(:,1:2)); % degree

lats_M = str2num(lats_(:,3:end)); % minute

lats = lats_D+lats_M/60;

% 经度转换

lons = sm_singleMonth(:,3);

lons_ = num2str(lons);

lons_D = str2num(lons_(:,1:3)); % degree

lons_M = str2num(lons_(:,4:end)); % minute

lons = lons_D+lons_M/60;

% 转化为日期

date = datetime(sm_singleMonth(:,5:7));

% 平均温,最高温和最低温

temAvg = sm_singleMonth(:,8);

temMax = sm_singleMonth(:,9);

temMin = sm_singleMonth(:,10);

% 整合数据

temthis = [sm_singleMonth(:,1),lats,lons,datenum(date),temAvg,temMax,temMin];

save([filedir_save,'TEM',time_obv,'.mat'],'temthis')

end

2. 计算日平均温大于10度的天数和总积温(1980-2016)

clear, clcaddpath(genpath(pwd))

% load所有的气象观测站信息,包含站点编号、精度和纬度

load('station_info.mat')stalen = length(stainfo);

% 预定于数据,用于存贮结果

datesGT10 = nan(2419,37);

accumulatedT = nan(2419,37);

allyears = 1980:1:2016;

for iyear = 1:37

tic

% this year

disp(iyear);

thisyear = allyears(iyear);

dateofYear = 365; % 1年中的天数

if rem(thisyear,4)==0

dateofYear = 366;

end

% load所有的温度数据

files = dir(['G:\indices_wangjing\tem_mat\TEM' num2str(thisyear) '*.mat']);

% 将一年中的数据连在一起

temEachyear = [];

for imonth = 1:12

% load each month data

load(files(imonth).name)

% cat each month

temEachyear = cat(1,temEachyear,temthis);

end

%% 计算各站点的积温天数和总积温

for ista=1:2419

staNO = stainfo(ista,1);

temeachstation = temEachyear(temEachyear(:,1)==staNO,:);

% temperature=temperature/10

temeachstation(:,5:7) = temeachstation(:,5:7)/10;

%% 剔除异常值

% if the temperature gt 1000, turn in to nan

temeachstation(temeachstation(:,5)>10000,:)=nan;

% delete nan data

temeachstation = temeachstation(~isnan(temeachstation(:,5)),:);

tem_avg = temeachstation(:,5);

dates_mea = temeachstation(:,4);

% 如果这个站点一年中的观测数据少于300天,则不计算积温

lendays = length(temeachstation);

if lendays<300

continue;

end

datesta = datenum(thisyear,1,1);

dateend = datenum(thisyear,12,31);

% 如果观测数据少于该年的天数,则对观测数据进行插值

if lendays

tem_interp = interp1(dates_mea,tem_avg,(datesta:1:dateend));

else

tem_interp = tem_avg;

end

%% 对插值后的气温数据进行5日滑动平均

for idate = 1:dateofYear

if idate>2 && idate

tem_interp(idate) = (tem_interp(idate-2)+tem_interp(idate-1)+...

tem_interp(idate)+tem_interp(idate+1)+tem_interp(idate+2))/5;

else

continue

end

end

%% !!!积温计算算法

% 找到日平均气温大于10的日期

Iaa = find(tem_interp>10);

len1 = zeros(366,1);

j=1;

for i=1:length(Iaa)-1

if Iaa(i+1)-Iaa(i)==1

len1(j) = len1(j)+1;

else

j=j+1;

end

end

% a代表气温连续超过10的最长天数

[a,b] = max(len1);

c = sum(len1(1:b-1));

% if no temperature gt 10, continue

if a<1

continue

end

% d代表积温计算的起始日期

d=Iaa(b+c);

% 保存数据

datesGT10(ista,iyear) = a;

accumulatedT(ista,iyear) = sum(tem_interp(d:d+a),'omitnan');

end

toc

end

%% 将结果保存到excel表格中

xlswrite('大于10度的积温天数.xlsx',datesGT10)

xlswrite('大于10度的年积温.xlsx',accumulatedT)

3.自定义函数importfile_tem_v1.m

function temthis = importfile_tem_v1(filename, startRow, endRow)

%IMPORTFILE 将文本文件中的数值数据作为矩阵导入。

%   SURFCLICHNMULDAYTEM12001198001 = IMPORTFILE(FILENAME) 读取文本文件 FILENAME

%   中默认选定范围的数据。

%

%   SURFCLICHNMULDAYTEM12001198001 = IMPORTFILE(FILENAME, STARTROW, ENDROW)

%   读取文本文件 FILENAME 的 STARTROW 行到 ENDROW 行中的数据。

%

% Example:

%   temthis = importfile('SURF_CLI_CHN_MUL_DAY-TEM-12001-198001.TXT', 1, 74679);

%

%    另请参阅 TEXTSCAN。

% 由 MATLAB 自动生成于 2019/01/12 15:20:54

%% 初始化变量。

if nargin<=2

startRow = 1;

endRow = inf;

end

%% 每个文本行的格式字符串:

%   列1: 双精度值 (%f)

%   列2: 双精度值 (%f)

%   列3: 双精度值 (%f)

%   列4: 双精度值 (%f)

%   列5: 双精度值 (%f)

%   列6: 双精度值 (%f)

%   列7: 双精度值 (%f)

%   列8: 双精度值 (%f)

%   列9: 双精度值 (%f)

%   列10: 双精度值 (%f)

% 有关详细信息,请参阅 TEXTSCAN 文档。

formatSpec = '%5f%5f%6f%7f%5f%3f%3f%7f%7f%7f%[^\n\r]';

%% 打开文本文件。

fileID = fopen(filename,'r');

%% 根据格式字符串读取数据列。

% 该调用基于生成此代码所用的文件的结构。如果其他文件出现错误,请尝试通过导入工具重新生成代码。

dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', '', 'WhiteSpace', '', 'EmptyValue' ,NaN,'HeaderLines', startRow(1)-1, 'ReturnOnError', false);

for block=2:length(startRow)

frewind(fileID);

dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', '', 'WhiteSpace', '', 'EmptyValue' ,NaN,'HeaderLines', startRow(block)-1, 'ReturnOnError', false);

for col=1:length(dataArray)

dataArray{col} = [dataArray{col};dataArrayBlock{col}];

end

end

%% 关闭文本文件。

fclose(fileID);

%% 对无法导入的数据进行的后处理。

% 在导入过程中未应用无法导入的数据的规则,因此不包括后处理代码。要生成适用于无法导入的数据的代码,请在文件中选择无法导入的元胞,然后重新生成脚本。

%% 创建输出变量

temthis= [dataArray{1:end-1}];

转载本文请联系原作者获取授权,同时请注明本文来自朱永超科学网博客。

收藏

分享

分享到:

matlab程序算天气,科学网-站点气温数据的积温计算(含Matlab程序实现)-朱永超的博文...相关推荐

  1. matlab程序算天气,科学网—站点气温数据的积温计算(含Matlab程序实现) - 朱永超的博文...

    活动温度总和(简称积温)是某一段时间内逐日平均气温≥10℃持续期间日平均气温的总和.是研究温度与生物有机体发育速度之间关系的一种指标,从强度和作用时间两个方面表示温度对生物有机体生长发育的影响.一般以 ...

  2. matlab 水平投影,科学网—Matlab中如何将投影信息写入到shape文件中 - 朱永超的博文...

    在Matlab中保存shape格式数据时,没有具体的函数可以将投影信息直接写入到shape文件中,不过可以通过另外一种方式实现.看下shape格式的文件不难发现,shape文件的投影信息是一个单独的文 ...

  3. 哨兵二号数据offline_科学网—利用ENVI 5.3读取哨兵2号(Sentinel-2)L1C数据 - 朱永超的博文...

    2016年12月6号,欧空局修改了哨兵2号(S2)数据的命名规则,这导致ENVI 5.3仅能打开此前获取的S2数据,而之后的数据仅能在ENVI最新版5.4中打开,参见:https://yceo.yal ...

  4. 【单目标优化求解】基于matlab增强型黑猩猩优化器算法求解单目标优化问题【含Matlab源码 2013期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[单目标优化求解]基于matlab增强型黑猩猩优化器算法求解单目标优化问题[含Matlab源码 2013期] 点击上面蓝色字体,直接付费下 ...

  5. 【图像去噪】基于matlab小波变换(硬阙值+软阙值)图像去噪【含Matlab源码 391期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab小波变换(硬阙值+软阙值)图像去噪[含Matlab源码 391期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  6. 【图像重建】基于matlab布雷格曼迭代算法集合ART算法CT图像重建【含Matlab源码 1905期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像重建]基于matlab布雷格曼迭代算法集合ART算法CT图像重建[含Matlab源码 1905期] 获取代码方式2: 通过订阅紫极神光 ...

  7. 威纶通触摸屏分期付款锁机(带PC程序) 文件内包含 威纶通触摸屏源程序例子(含宏程序) 总共两个页面可以快速移植到自己的程序上

    威纶通触摸屏分期付款锁机(带PC程序) 文件内包含 威纶通触摸屏源程序例子(含宏程序) 总共两个页面可以快速移植到自己的程序上. 带PC端程序自动计算设定时间密码. 宏程序带详细注释,适合学习 可以动 ...

  8. 【光学】基于matlab GUI矩阵法和等效界面法光学薄膜对反射率影响【含Matlab源码 2102期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI矩阵法和等效界面法光学薄膜对反射率影响[含Matlab源码 2102期] 点击上面蓝色字体,直接付费下载, ...

  9. 【风电功率预测】基于matlab帝国殖民竞争算法优化BP神经网络风电功率预测【含Matlab源码 1314期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [风电功率预测]基于matlab帝国殖民竞争算法优化BP神经网络风电功率预测[含Matlab源码 1314期] ⛄二.帝国殖民竞争算法简 ...

最新文章

  1. Devexpress VCL Build v2014 vol 14.1.4 发布
  2. 数组的最后一位的下一位为什么是0?
  3. Mybatis源码笔记之浅析StatementHandler
  4. IOT(31)---物联网平台架构设计
  5. 25年前,互联网大佬在最原始的论坛网上冲浪
  6. vista iis7上安装php4.4.7
  7. JS事件流与DOM事件处理程序
  8. 初中计算机授课教案模板,初中课程教案模板
  9. 首都师范 博弈论 3 4 2反复剔除严格劣策略
  10. mini LED 背光驱动芯片的发展
  11. postgresql安装报错
  12. linux 驱动笔记(七)
  13. [已解决]阿里云安全组开放端口,宝塔面板仍无法访问
  14. Android 微信分享视频缩略图不显示问题
  15. 苹果6s系统更新无服务器,我的iPhone6s国行 系统更新一直显示“正在检查更新”,无法更新是为什么?...
  16. Spooling技术简单熟悉
  17. verilog中always和initial的区别
  18. 三年又三年,我朋友都生娃了《打工人的故事》
  19. 【微信小程序】消息推送服务器配置及服务器域名配置(记录坑)
  20. 潭州学院html学习(day09)

热门文章

  1. Linux 内核likely与unlikey
  2. 思岚科技定位导航技术凸显 成为服务机器人企业首选品牌
  3. 90%AI企业都亏损?阿里、华为等高管来苏畅谈人工智能
  4. 函数平移口诀_三角函数平移伸缩变换口诀是什么
  5. if(!ispostback)其用法和作用 什么时候该用?
  6. 【机器学习】数据归一化全方法总结:Max-Min归一化、Z-score归一化、数据类型归一化、标准差归一化等
  7. java数组可以包含对象吗_数组可以包含对象类型的元素吗_对象数组
  8. 飞机大战--java
  9. 在网页调用微信支付,并解决IOS调用提示“缺少参数timeStamp”问题
  10. 力天创见无感人脸识别方案