matlab⽇期统计,Matlab⽇期频次统计
⼀、孕妇建档⽉份频次统计
源数据样本,为某医院⼀段时间内的孕妇建档时间
2015-04-22 10:12:52
2014-11-21 17:16:47
2013-12-16 17:35:44
2013-12-26 16:58:46
2013-12-27 16:44:33
2013-12-27 16:45:32
2013-12-30 8:26:20
2013-12-30 9:47:27
2013-12-30 8:46:42与老妈的故事
2013-12-30 11:00:06
2013-12-30 11:08:42
分析⽬的:统计每个⽉的孕妇建档频次,这就要提取源数据的第⼀列,同截取年⽉数据,然后做频次直⽅图,看孕妇建档频次有没有随⽉份变化的规律。
Matlab 代码:
%孕妇建档⽇期统计
[datestr,timestr]=textread('','%s%s');
做自己就好的霸气语录f=cell2mat(datestr);
f=f(:,1:7);
f=tabulate(f);
f=sortrows(f,1);
bar(cell2mat(f(:,2)),1);
t(gca,'XTickLabel',f(:,1),'XTick',[1:length(f(:,1))]);
title( '孕妇建档时间统计' );%下⾯的代码是为了旋转横坐标轴标签
我最疼爱的人
xtb= get(gca,'XTickLabel');%获取横坐标轴标签句柄
xt= get(gca,'XTick');%获取横坐标轴刻度句柄
yt= get(gca,'YTick'); %获取纵坐标轴刻度句柄
xtextp=xt;%每个标签放置位置的横坐标
ytextp=yt(1)*ones(1,length(xt));
text(xtextp,ytextp,xtb,'HorizontalAlignment','right','VerticalAlignment','top','rotation',45,'fontsize',10);t(gca,'xticklabel','');% 将原有的标签隐去
最终⽣成效果图:
下⾯将对上⾯的 Matlab 代码进⾏分析。
1、读取 txt 中的⽇期时间数据
如果 txt 中是两列数值,譬如「19811986」,那只需要⽤ M = load('') 就可读取进 M 矩阵中,如下图所⽰。
>> M = load('');>> M(1:4,:)
ans=
1981 1986
1988 1993
1985 1989
1984 1984
然后就可以⽤M(:,1) 和M(:,2) 访问这两列数据。
季x越但本例中我们要读取的不是数值数据,⽽是包含⽇期的字符串,我们就不能再⽤ load 函数读取了,要⽤ textread 函数。因为是两列数据,就不能⽤ M=textread('','%s'); 来读取了,如果硬要这样读,那⽇期和时间就会在返回的元胞数组 M 中混到⼀块,如下所⽰:
>> M=textread('','%s');>> M(1:4)
ans=
'2015-04-22'
回函模板
通辽美食'10:12:52'
'2014-11-21'
'17:16:47'
为了把两列数据分别读进两个元胞数组,要使⽤:
>> [datestr,timestr]=textread('','%s%s');>> datestr(1:4)
ans=
'2015-04-22'
'2014-11-21'
'2013-12-16'
'2013-12-26'
textread 函数返回的是装满数据的元胞数组,datestr 和 timestr 都是元胞数组。
元胞数组是MATLAB的⼀种特殊数据类型,可以将元胞数组看做⼀种⽆所不包的通⽤矩阵。通过⼩括号()⾥⾯加下标,访问cell数组中的数据,返回的是对应的cell。通过⼤括号{}⾥⾯加下标,访问cell数组中的数据,返回的是对应cell的内容。
>> [datestr,timestr]=textread('','%s%s');>> datestr(1)
ans=
'2015-04-22'
>> class(datestr(1))
ans=cell>> datestr{1}
广州出租车收费标准ans=
2015-04-22
>> class(datestr{1})
ans=
char
2、从 2015-04-22 中提取出 2015-04 来
可以⽤正则表达式,但我们这⾥使⽤矩阵的⽅法,正则表达式的⽅法我们后⾯介绍。⽬前 datestr 还是 cell 元胞数组,我们先把元胞数组转成 char 矩阵,使⽤ cell2mat 函数。
>> [datestr,timestr]=textread('','%s%s');>> class(datestr)
ans=cell>> f=cell2mat(datestr);>> class(f)
ans=
char
>> f(1:4,:)
ans=
2015-04-22
2014-11-21
2013-12-16
2013-12-26
然后对 char 矩阵提取所需字符即可。
>> f=f(:,1:7);>> f(1:4,:)
ans=
2015-04
2014-11
2013-12
2013-12
3、统计⽉份的频次
如果 f 是⼀维数值矩阵,那只需要使⽤ hist 函数就可以了,但因为这⾥要统计的是⽇期字符的频次,hist 就不能⽤了。
>>hist(f) Error using ==>hist
Input arguments must be numeric.
还好 Matlab 提供了另⼀个类似的频数统计函数 tabulate。
>> f=tabulate(f);>>f
f=
'2015-04' [1386] [6.4706]'2014-11' [ 582] [2.7171]'2013-12' [ 84] [0.3922]'2014-01' [ 766] [3.5761]'2014-09' [ 587] [2.7404]'2014-02' [ 616] [2.8758]
……
使⽤ sortrows 函数对根据第⼀列元素对 f 排序。
>> f=sortrows(f,1);>>f
f=
'2013-12' [ 84] [0.3922]'2014-01' [ 766] [3.5761]'2014-02' [ 616] [2.8758]'2014-03' [1000] [4.6685]'2014-04' [ 977] [4.5612]'2014-05' [ 948] [4.4258]'2014-06' [ 961] [4.4865]
4、绘直⽅图
绘图就很简单了,bar 函数就可以。⾸先我们要 f 转成⼀维矩阵,因为上⾯ tabulate 返回的是元胞数组。转成⾏矩阵、列矩阵均可。然后再调⽤ bar 绘制 f 第⼆列的数据图,并使⽤ f 的第⼀列设置 x 轴标签,再加上 Title。
>> bar(cell2mat(f(:,2)),1);>> t(gca,'XTickLabel',f(:,1),'XTick',[1:length(f(:,1))]);>> title( '孕妇建档时间统计' );%下⾯的代码是为了旋转横坐标轴标签
本来到这⾥绘图可以算完成了,但是,看看 x 轴标签拥挤得,完全没法看,所以需要对 x 轴标签的显⽰进⾏下调整。需要旋转 x 轴标签了,才发现强⼤的 Matlab 实现这个功能竟然这么⿇烦,需要通过下⼀⼩节来说明。
5、旋转 x 轴标签
下⾯是旋转 x 轴标签的代码,当时找这段代码⽐较烦恼,因为实在不能相信 Matlab 旋转个标签都这么⿇烦。其实这段代码也很简单,就是获取 x 轴标签句柄,并设置到相应的位置,然后将原有标签隐去。xt 和 yt 不重要,只是⽤了下 xt 的长度和 yt(1) 的 0 值。xtb 是标签内容,xtextp 和 ytextp 是标签位置坐标。text 函数可查阅相关⼿册了解。
xtb = get(gca,'XTickLabel');%获取横坐标轴标签句柄
xt= get(gca,'XTick');%获取横坐标轴刻度句柄
yt= get(gca,'YTick'); %获取纵坐标轴刻度句柄
xtextp=xt;%每个标签放置位置的横坐标
ytextp=yt(1)*ones(1,length(xt));
text(xtextp,ytextp,xtb,'HorizontalAlignment','right','VerticalAlignment','top','rotation',45,'fontsize',10);t(gca,'xticklabel','');% 将原有的标签隐去
最终图形显⽰如第⼀张图所⽰。
⼆、孕妇建档某⼀⽉频次统计
五副对联
上⾯的例⼦选取的第⼀列的所有数据,只是提取了每个数据的年⽉。现在要统计某⼀个⽉份的数据,就要对数据进⾏过滤。这⾥我们使⽤正则表达式进⾏过滤,代码如下。绘图代码跟上⾯⼀样。
%孕妇建档时间⼀个⽉内
[datestr,timestr]=textread('','%s%s');
k=regexp(datestr,'^2015-07.*$', 'match');
ix=~cellfun('impty',k);
index=find(ix~=0);
f=datestr(index);
f=tabulate(f);
f=sortrows(f,1);
bar(cell2mat(f(:,2)),1);t(gca,'XTickLabel',f(:,1),'XTick',[1:length(f(:,1))]);
title('孕妇建档时间⼀个⽉内' );%下⾯的代码是为了旋转横坐标轴标签
xtb= get(gca,'XTickLabel');%获取横坐标轴标签句柄
xt= get(gca,'XTick');%获取横坐标轴刻度句柄
yt= get(gca,'YTick'); %获取纵坐标轴刻度句柄
xtextp=xt;%每个标签放置位置的横坐标
ytextp=yt(1)*ones(1,length(xt));
text(xtextp,ytextp,xtb,'HorizontalAlignment','right','VerticalAlignment','top','rotation',45,'fontsize',10);t(gca,'xticklabel','');% 将原有的标签隐去
⽣成的图形如下: