• maltab datenum函数与正则表达式巧用:逐日数据转为逐月数据、日序转月序


    引言与示例:datenum日序转月序

    在处理数据时,我们经常需要将逐日数据转为逐月数据,这就需要我们知道日序对应的月序,比方说,我有2019年一整年的天数据共365个,我知道这个文件代表的是2018年的第几天?那么我如何知道它是2018年的第几个月呢?
    如果直接上网搜索你会发现一个常见的思路:首先判断是闰年还是非闰年,然后给出每个月都日期总数,编写函数来计算。
    这方法当然可行,但却是基于C语言的一种操作,实际上,利用matlab的datenum函数,我们只用一行代码就能实现这个过程。

    function mon= day2mon(year,daynum)
    %   year为年份,daynum为日序列
    mon=month(datenum(year,1,0)+daynum);
    end
    
    • 1
    • 2
    • 3
    • 4

    比如说,我想知道2020年第234天是第几个月,我们只要输入:day2mon(2020,234)即可。
    在这里插入图片描述

    利用正则表达式提取日期

    当然,这种方法有一个要求,即,逐日数据需要完整,文件命名按照日序排列。
    这时候我们再用日序似乎就不再适用了,这时如果你的文件名如果包含了日期的话,可以构造一个正则表达式提取。
    比如说我这个文件:
    在这里插入图片描述
    2006年逐日海冰,本来应当有365天,却只有364个数据,不知道哪儿缺了,这时可以构造正则表达式把月份从文件名里提出来。
    文件名的命名规则:“POGOC_OUC_AMSR-E_DTASI_n_sic_YYYYMMDD.hdf”,命名相当有规律,通过正则表达式可以很轻松地提取。

    numstr=regexp(str,'\d{8}','match')
    
    • 1

    返回
    在这里插入图片描述
    然后将其转换为数值型,再用datenum返回月序即可。

    numdate=str2num(numstr{j}{1});
    mon(j)=month(datenum(numdate))
    
    • 1
    • 2

    具体应用-15年海冰日数据转月数据

    下面我们来讲讲一下具体的运用过程,
    我们的目的是:将2005-2019年的海冰日数据转为月数据。
    首先定义一下年份:year=2005:2019
    然后先批量读个数据文件(hdf格式),为了避免过于复杂,我们先算一年的吧,这时,i=1,year(i)=2005。
    先批量读个文件:

    files=dir([path,num2str(year(i)),'\*.hdf']);
    fullname=cell(1,length(files));
    seaice=cell(1,length(files));
    filename=cell(1,length(files));
    % 读取逐日数据
    for n=1:length(files)
    fullname{n}=[path,num2str(year(i)),'\',files(n).name];
    seaice{n}=hdfread(fullname{n},'OUC_SIC');
    filename{n}=files(n).name;
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后用我们正则,提取出月序:

    daynum=1:length(files);
    numstr=regexp(filename,'\d{8}','match');
    mon=zeros(1,length(numstr));
    
    • 1
    • 2
    • 3

    将提取的月序与索引一一对应,由于存在元胞数组里,先用cat函数拼接,再相加。

    for m=1:12
        d=seaice(mon==m);
        monsic{12*(i-1)+m}=mean(cat(3,d{:}),3);
    end
    
    • 1
    • 2
    • 3
    • 4

    完成。

  • 相关阅读:
    华朗复读衔接营励志开营!全名师阵容护航 解读高考成功秘钥
    微信小程序订单页面怎么写啊,刚开始接触这个自己没有头绪不知道怎么下手
    vue-cli创建项目(详情步骤)
    10 种保证接口数据安全的方案!
    5.后端·新建子模块与开发(自动模式)
    python中的字符串也是可迭代对象吗?
    Shellcode——绕过31
    【app篇】可拖拽BLE遥控app简单版本
    uniapp 车牌号输入 车牌号键盘 新能源车牌键盘 特殊车辆车牌键盘
    重温Servlet
  • 原文地址:https://blog.csdn.net/weixin_43750300/article/details/126657230