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

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

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(:,:);
f=tabulate(f);
f=sortrows(f,);
bar(cell2mat(f(:,)),1);
set(gca,'XTickLabel',f(:,),'XTick',[1:length(f(:,1))]);
title( '孕妇建档时间统计' );%下面的代码是为了旋转横坐标轴标签
xtb = get(gca,'XTickLabel');% 获取横坐标轴标签句柄
xt = get(gca,'XTick');% 获取横坐标轴刻度句柄
yt = get(gca,'YTick'); % 获取纵坐标轴刻度句柄
xtextp=xt;%每个标签放置位置的横坐标
ytextp=yt()*ones(,length(xt));
text(xtextp,ytextp,xtb,'HorizontalAlignment','right','VerticalAlignment','top','rotation',,'fontsize',);
set(gca,'xticklabel','');% 将原有的标签隐去

最终生成效果图:

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

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

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

>> M = load('CoupleBirth.txt');
>> M(:,:) ans =

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

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

>> M=textread('PregnantWomanFileTime.txt','%s');
>> M(:) ans = '2015-04-22'
'10:12:52'
'2014-11-21'
'17:16:47'

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

>> [datestr,timestr]=textread('PregnantWomanFileTime.txt','%s%s');
>> datestr(:) 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() ans = '2015-04-22' >> class(datestr()) ans = cell >> datestr{} ans = -- >> class(datestr{}) 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(:,:) ans = --
--
--
--

然后对 char 矩阵提取所需字符即可。

>> f=f(:,:);
>> f(:,:) ans = -
-
-
-

3、统计月份的频次

如果 f 是一维数值矩阵,那只需要使用 hist 函数就可以了,但因为这里要统计的是日期字符的频次,hist 就不能用了。

>> hist(f)
??? Error using ==> hist
Input arguments must be numeric.

还好 Matlab 提供了另一个类似的频数统计函数 tabulate。

>> f=tabulate(f);
>> f f = '2015-04' [] [6.4706]
'2014-11' [ ] [2.7171]
'2013-12' [ ] [0.3922]
'2014-01' [ ] [3.5761]
'2014-09' [ ] [2.7404]
'2014-02' [ ] [2.8758]
……

使用 sortrows 函数对根据第一列元素对 f 排序。

>> f=sortrows(f,);
>> f f = '2013-12' [ ] [0.3922]
'2014-01' [ ] [3.5761]
'2014-02' [ ] [2.8758]
'2014-03' [] [4.6685]
'2014-04' [ ] [4.5612]
'2014-05' [ ] [4.4258]
'2014-06' [ ] [4.4865]

4、绘直方图

绘图就很简单了,bar 函数就可以。首先我们要 f 转成一维矩阵,因为上面 tabulate 返回的是元胞数组。转成行矩阵、列矩阵均可。然后再调用 bar 绘制 f 第二列的数据图,并使用 f 的第一列设置 x 轴标签,再加上 Title。

>> bar(cell2mat(f(:,)),);
>> set(gca,'XTickLabel',f(:,),'XTick',[:length(f(:,))]);
>> 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()*ones(,length(xt));
text(xtextp,ytextp,xtb,'HorizontalAlignment','right','VerticalAlignment','top','rotation',,'fontsize',);
set(gca,'xticklabel','');% 将原有的标签隐去

最终图形显示如第一张图所示。

二、孕妇建档某一月频次统计

上面的例子选取的第一列的所有数据,只是提取了每个数据的年月。现在要统计某一个月份的数据,就要对数据进行过滤。这里我们使用正则表达式进行过滤,代码如下。绘图代码跟上面一样。

%孕妇建档时间一个月内
[datestr,timestr]=textread('PregnantWomanFileTime.txt','%s%s');
k=regexp(datestr,'^2015-07.*$', 'match');
ix=~cellfun('isempty',k);
index=find(ix~=);
f=datestr(index);
f=tabulate(f);
f=sortrows(f,);
bar(cell2mat(f(:,)),);
set(gca,'XTickLabel',f(:,),'XTick',[:length(f(:,))]);
title( '孕妇建档时间一个月内' );%下面的代码是为了旋转横坐标轴标签
xtb = get(gca,'XTickLabel');% 获取横坐标轴标签句柄
xt = get(gca,'XTick');% 获取横坐标轴刻度句柄
yt = get(gca,'YTick'); % 获取纵坐标轴刻度句柄
xtextp=xt;%每个标签放置位置的横坐标
ytextp=yt()*ones(,length(xt));
text(xtextp,ytextp,xtb,'HorizontalAlignment','right','VerticalAlignment','top','rotation',,'fontsize',);
set(gca,'xticklabel','');% 将原有的标签隐去

生成的图形如下:

下面对上面使用正则表达式的代码进行解析。

k=regexp(datestr,'^2015-07.*$', 'match');

regexp 查找每个元素中匹配字符的位置并返回,k 的值截取如下:

    {1x1 cell}
{1x1 cell}
{1x1 cell}
{1x1 cell}
{1x1 cell}
{}
{}
{}
{}

代码 ix=~cellfun('isempty',k)  是判断元胞数组中的元素是否为空,ix 的值截取如下:


index=find(ix~=0) 是找到上面元胞数组中不为空的元素坐标,这是根据正则表达式提取数据很重要的一步,很有技巧。index 的值截取如下:

>> index=find(ix~=);
>> index index =

下面就需要根据上面的 index 提取相应的数据了。会者不难,难者不会。

>> f=datestr(index);
>> f f = '2015-07-07'
'2015-07-09'
'2015-07-15'
'2015-07-06'

绘图功能跟上面一样。

三、孕妇建档时间一天内统计

对一天内的孕妇建档频次进行统计。

[datestr,timestr]=textread('PregnantWomanFileTime.txt','%s%s');
f=regexprep(timestr,':\d+:\d+$','');
f=str2num(char(f));%这个代码可是几经坎坷
hist(f);
title( '孕妇建档时间一天内频次统计' );

生成图形如下:

代码解析如下:

f=regexprep(timestr,':\d+:\d+$','') 是把时间列的分和秒都去掉,返回的就是小时。原理是用 regexprep 把时间的分秒都替换成空,剩下的就是小时。

>> f=regexprep(timestr,':\d+:\d+$','');
>> f(:) ans = ''
''
''
''

下面就是要想办法把 f 中表示小时的字符转换成数值类型,因为如果跟上面一样用 tabulate 进行统计,并使用 sortrows 排序时,出发生把 8 排在 12 后面的情况,而这里正好又都是数值类型,我们何不直接转换成数值,然后用 hist 呢?

>> [datestr,timestr]=textread('PregnantWomanFileTime.txt','%s%s');
f=regexprep(timestr,':\d+:\d+$','');
>> f(:) ans = ''
''
''
'' >> f=str2num(char(f));%这个代码可是几经坎坷
>> f(:) ans =

其中 f=str2num(char(f)) 这个代码找得我好苦。因为起初我想到用 cell2mat 把元胞数组内的字符转换成数值,结果是这样的。

>> [datestr,timestr]=textread('PregnantWomanFileTime.txt','%s%s');
f=regexprep(timestr,':\d+:\d+$','');
>> f(:) ans = ''
''
''
'' >> abc=cell2mat(f)
??? Error using ==> cat
CAT arguments dimensions are not consistent. Error in ==> cell2mat at
m = cat(,m{:}); >> abc=cell2mat(f') abc = ……

无力吐槽……

后来终于找到正确的转换方式:f=str2num(char(f))

后面的绘图,直接用 hist,就没什么难度了。

Matlab 日期频次统计的更多相关文章

  1. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...

  2. MySQL按日期分组并统计截止当前时间的总数(实例教程)

    MySQL按日期分组并统计截止当前时间的总数 建表语句 SET NAMES utf8mb4; ; -- ---------------------------- -- Table structure ...

  3. MySql按日期时间段进行统计(前一天、本周、某一天、某个时间段)

    在mysql数据库中,常常会遇到统计当天的内容.例如,在user表中,日期字段为:log_time 统计当天 sql语句为: select * from user where date(log_tim ...

  4. python实例:元组命名 频次统计 字典排序

    1.为元组中元素命名 方法1.定义常量 NAME, AGE = 0, 1 student = ('乔峰', 29, 'qf@jinyong.com') name = student[NAME] age ...

  5. Matlab时频图

    [b,f,t]=specgram(data,nfft,Fs,window,numoverlap); imagesc(t,f,20*log10(abs(b))), axis xy, colormap(j ...

  6. matlab 时频分析(短时傅里叶变换、STFT)

    短时傅里叶变换,short-time fourier transformation,有时也叫加窗傅里叶变换,时间窗口使得信号只在某一小区间内有效,这就避免了传统的傅里叶变换在时频局部表达能力上的不足, ...

  7. MySQL中实现连续日期内数据统计,缺省天数0补全

    某一日,需要查询订单表中一个月每天的金额数 查询出数据如下: array(14) { [0] => array(2) { ["money"] => string(7) ...

  8. Android性能测试--垃圾回收频次统计的作用

    频繁的垃圾回收有可能暗示着内存泄露,在我手机统计数据,每次垃圾回收会占据100ms左右,这对内存和事件响应要求严格的程序(游戏等)来讲是可观的性能损耗.

  9. Matlab 三维绘图与统计绘图

    一. 三维绘图 p = : pi/: *pi; x = cos(p); y = sin(p); z = p; plot3(x,y,z) x = -:.:; %有-2为起点,2为递增步长,2为终止点 y ...

随机推荐

  1. javascrpt 页面格式化页面

    下面这个页面,格式化javaScript <html> <head> <title>JS格式化工具 </title> <meta http-equ ...

  2. swagger接口变动监控

    版本与版本之间迭代,总会发生接口的变化,而这些变化开发不会都告诉测试,测试需要把全部接口检查一遍,这样就降低了测试效率. 为了解决这个问题,结合公司实际项目进行了以下设计: 1.对比测试环境swagg ...

  3. notepad快捷键总结

    notepad快捷键总结 常用快捷键: 快捷键 功能1.Ctrl-D 复制当前行2.Ctrl-L 删除当前行3.Ctrl-T 把当前行和前面一行调换位置4.F11 切换全屏模式5.Ctrl-Shft- ...

  4. odoo学习记录1

    1. odoo通过ORM(对象关系映射)实现底层数据与上层逻辑到关联,保证数据存储的安全性和使用上到便利性. 2. odoo由模块组成,每个模块包含:Bussiness Object, Data, W ...

  5. centos7部署PaaS平台环境(mesos+marathon)

    假如有5台主机可以使用,ip地址如下 规划(2master+3slave) master: 192.168.248.205 ---master1 192.168.248.206 ---master2 ...

  6. C++学习笔记--异常简介

    C++异常是对程序运行过程中发生的异常情况(如被0除)的一种响应.异常提供了将控制权从程序的一个部分传递到另一部分的途径. 1.对异常的处理有3个部分组成: (1)引发异常 (2)捕获有处理程序的异常 ...

  7. Delphi APP 開發入門(七)通知與雲端推播

    Delphi APP 開發入門(七)通知與雲端推播 分享: Share on facebookShare on twitterShare on google_plusone_share   閲讀次數: ...

  8. listview与adapter用法

    Android listview与adapter用法 listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用 ...

  9. k近邻 KNN

    KNN是通过测量对象的不同特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20 ...

  10. C语言赋初始值