当前位置: 首页 > news >正文

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

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

利用正则表达式提取日期

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

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

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

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

具体应用-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

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

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

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

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

完成。

相关文章:

  • PTA JAVA02 基础语法1
  • C++ 语言学习 day06 string , 异常
  • Linux命令`ll`的结果解析
  • 查题校园公众号查题系统
  • git分布式版本控制系统
  • C++ Color the ball
  • mysql的基础操作语句
  • Cookie/Session
  • java抽象类和接口(Comparator和Conparable的使用)
  • 百度首个江苏智算中心落地 携手盐城共建200P算力规模
  • 并发编程(四)---设计模式
  • GitHub:建立仓库,本地上传与更新内容
  • Linux EXPORT_SYMBOL宏详解
  • 猿创征文丨赶紧进来!!!带你0距离全面接触 变量和常量
  • Unirech腾讯云代充-通过VNC 登录腾讯云国际版Windows云服务器实例教程
  • [笔记] php常见简单功能及函数
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Node 版本管理
  • Redis在Web项目中的应用与实践
  • Spring Boot MyBatis配置多种数据库
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端技术周刊 2019-01-14:客户端存储
  • 首页查询功能的一次实现过程
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • #FPGA(基础知识)
  • (06)金属布线——为半导体注入生命的连接
  • (1)Nginx简介和安装教程
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)鸿鹄云架构一服务注册中心
  • (一)Neo4j下载安装以及初次使用
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)【Hibernate总结系列】使用举例
  • (转)大型网站的系统架构
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 反射 Reflect
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——