码迷,mamicode.com
首页 > 其他好文 > 详细

Matlab 日期频次统计

时间:2015-10-07 22:39:45      阅读:474      评论:0      收藏:0      [点我收藏+]

标签:

一、孕妇建档月份频次统计

源数据样本,为某医院一段时间内的孕妇建档时间

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(PregnantWomanFileTime.txt,%s%s);
f=cell2mat(datestr);
f=f(:,1:7);
f=tabulate(f);
f=sortrows(f,1);
bar(cell2mat(f(:,2)),1);
set(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); 
set(gca,xticklabel,‘‘);% 将原有的标签隐去

最终生成效果图:

技术分享

下面将对上面的 Matlab 代码进行分析。

1、读取 txt 中的日期时间数据

如果 txt 中是两列数值,譬如「1981 1986」,那只需要用 M = load(‘shuzhi.txt‘) 就可读取进 M 矩阵中,如下图所示。

>> M = load(CoupleBirth.txt);
>> M(1:4,:)

ans =

        1981        1986
        1988        1993
        1985        1989
        1984        1984

然后就可以用 M(:,1) 和 M(:,2) 访问这两列数据。

但本例中我们要读取的不是数值数据,而是包含日期的字符串,我们就不能再用 load 函数读取了,要用 textread 函数。因为是两列数据,就不能用 M=textread(‘PregnantWomanFileTime.txt‘,‘%s‘); 来读取了,如果硬要这样读,那日期和时间就会在返回的元胞数组 M 中混到一块,如下所示:

>> M=textread(PregnantWomanFileTime.txt,%s);
>> M(1:4)

ans = 

    2015-04-22
    10:12:52
    2014-11-21
    17:16:47

为了把两列数据分别读进两个元胞数组,要使用:

>> [datestr,timestr]=textread(PregnantWomanFileTime.txt,%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(PregnantWomanFileTime.txt,%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(PregnantWomanFileTime.txt,%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);
>> set(gca,XTickLabel,f(:,1),XTick,[1:length(f(:,1))]);
>> title( 孕妇建档时间统计 );%下面的代码是为了旋转横坐标轴标签

技术分享

本来到这里绘图可以算完成了,但是,看看 x 轴标签拥挤得,完全没法看,所以需要对 x 轴标签的显示进行下调整。

5、旋转 x 轴标签

 

Matlab 日期频次统计

标签:

原文地址:http://www.cnblogs.com/NaughtyBaby/p/4859511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!