用MATLAB做日期筛选
应用场景
-
从excel当中导入日期格式的数据进入matlab,并以cell格式存储,现在的格式:2021/6/7(例)。
-
同时每个日期有对应的径流数据,以矩阵形式存储。
-
现在想要筛选一些日期及其对应的径流数据
提示:以下是本篇文章正文内容,下面几种情况可供参考
一、筛选某个确切日期之前/后的所有数据
运用datanum函数
1.datanum的含义
datanum(DATE)返回的是公元1月0日以来经过的天数,可以写作:
n=datenum('2021/6/7')
n =
738314
2.如何使用datanum做筛选
DATE为日期格式储存在cell的文件名,做出相减的指令,筛选出比1923/1/1日大的所有数据:
a = find(datenum(DATE(:,1))-datenum('1923/1/1')>0);
同理,筛选比1923/1/1日小的所有数据用<
得到的a为符合条件的行序号
再利用a的结果代回矩阵格式的径流数据中进行筛选,见三。
二、筛选条件较复杂的日期数据
1.分割cell的字符串
代码如下(示例):
m=arrayfun(@(k) DATE{k}(6:7),1:34,'un',0)
筛选的是DATE中第1到34行,第6-7位字符串结果,如2021/3/4,筛选出来的是3/
此步骤可将年、月、日数据分别提取出来
此时,提取出来的数据需要转置一下
代码如下(示例):
n=m'
2.选择需要的日期
2.1选择所有年份6月-9月的数据
先提取我要的月份,从cell类型n先转换为char类型k,再转换为double类型k2;提取比5大的月份(6789月,10、11、12月我只提取了第一位数字1,因此是小于5的,这里不考虑)
代码如下(示例):
k=cell2mat(n)
k2=str2num(k)
a=find(k2(:,1)-5>0)
得到的a为符合条件的行序号
再利用a的结果代回矩阵格式的径流数据中进行筛选,见三。
三.匹配日期对应的数据
代码如下(示例):
b是创建的新矩阵
NEW是创建序号和对应径流的新矩阵
b=(1:1:34334)
NEW=[b,Runoff]
index=find(ismember(NEW(:,1),a));
r = NEW(index,:)
r是提取出来的和a中序号一致的序号及对应径流数据
接下里我需要计算每年6、7、8、9月径流的平均值
c=r(:,2)%把6789月径流单独提取出来
B=[];
for i=1:94%计算94年,循环94次
B(i)=mean(c([122*i-121:122*i]))%求均值
end
总结
以上是提取含有年月日数据及其对应的径流数据时,需要筛选6、7、8、9月径流数据并对其求平均值的基本操作。