【问题标题】:filtering based on dates in Matlab基于 Matlab 中的日期过滤
【发布时间】:2015-09-10 18:14:07
【问题描述】:

我在下面显示的单元格数组中有一部分数据。我正在寻找对我有帮助的过滤器

  • 获取唯一代码列表(因为它们大约有 200 个)
  • 统计每个代码的出现次数(P0702,P0882)

在用户选择的任何开始日期和任何结束日期之间

    '1F'    '2013'  'd' '6/21/2013' ''  ''  'P0702' ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  ''
    '1'     '2013'  'F' '9/17/2013' ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''  ''  ''  ''  ''
    '1FA'   '2014'  'F' '7/26/2014' ''  ''  ''  'P0702' ''  ''  ''  ''  ''  ''  ''  ''  ''  ''
    '1F'    '2014'  'r' '12/13/2014'    ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  'P0702'
    '1F'    '2013'  'F' '11/3/2014' ''  ''  ''  ''  'P0702' ''  ''  ''  ''  ''  ''  ''  ''  ''
    '1FA'   '2014'  'y' '6/27/2014' ''  ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''  ''
    '1FA'   '2013'  'j' '11/10/2014'    ''  ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''  ''
    '1FA'   '2013'  'y' '6/13/2014' ''  'P0702' ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  ''
    '1FAD'  '2013'  'j' '1/23/2014' ''  ''  ''  ''  ''  ''  ''  ''  'P0883' 'P0702' ''  ''  ''  ''
    '1FA'   '2013'  'k' '4/24/2015' ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''  ''  ''
    '1FAD'  '2014'  'm' '12/5/2014' ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''
    '1FA'   '2013'  'g' '6/29/2013' ''  ''  ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''
    '1FA'   '2013'  'u' '5/12/2015' ''  ''  ''  ''  ''  ''  ''  ''  'P0702' 'P0882' ''  ''  ''  ''
    '1FA'   '2013'  'u' '5/12/2015' ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''  ''  ''
    '1FA'   '2013'  'b' '5/15/2015' ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''  ''  ''
    '1FA'   '2013'  'y' '7/13/2014' ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''
    '1F'    '2013'  'j' '7/16/2014' ''  ''  ''  ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''
    '1F'    '2013'  'n' '7/23/2013' ''  ''  ''  ''  ''  ''  ''  ''  ''  'P0702' ''  ''  ''  ''
    '1F'    '2013'  'm' '10/19/2013'    ''  ''  ''  ''  ''  ''  'P0882' 'P0702' ''  ''  ''  ''  ''  ''

例如输出会是这样的

从日期:06/21/2013 结束日期:2013 年 12 月 31 日

         Count
P0702    20
P0882    15

这里的 20 和 15 只是输出的示例(不是真实值)。 在这种情况下,我们将不胜感激。谢谢

【问题讨论】:

  • @rayryeng- 是的。我只是举了一个输出的例子
  • 您是在寻找矢量化实现,还是 for 循环可以工作?您的数据和元胞数组最简单的情况是使用循环。
  • @rayryeng- for 循环可以。
  • 你能澄清一下你的元胞数组的第一列和第三列是什么吗?那些字符串还是向量/矩阵?我正在尝试重新创建您的单元阵列,但事实证明这非常困难。
  • @rayryeng- 是的,它们是字符串。对此我深表歉意

标签: matlab date filter datefilter


【解决方案1】:

以下代码将:

  • 在您的表格中查找所有唯一代码
  • 找到dateStartdateStop之间的行
  • 统计每个代码的出现次数。

%% // INPUTS
dstart = '06/21/2013' ; %// starting date
dstop  = '12/31/2013' ; %// end date
%// code2count = {'P0702','P0882'} ; %// done below by looking up the table

%% // find unique codes
idxCode = ~cellfun(@isempty , C ) ;
idxCode(:,1:5) = false ; %// will not consider 5 first columns
code2count = unique(C(idxCode)) ;

%% // Extract dates
dateFormat = 'MM/DD/YYYY' ;
dateStart = datenum(dstart, dateFormat) ;
dateStop  = datenum(dstop , dateFormat) ;
dateCol = cellfun(@(d) datenum(d,dateFormat) , C(:,4) ) ;

%// this contains the indices of the matching dates
idxDateOk = (dateCol >= dateStart) & (dateCol <= dateStop ) ; 

%% // now count
nCodes = numel(code2count) ;
counts = zeros(nCodes,1) ;
fprintf('%-10s   Counts\n','Code')
for k=1:nCodes
    counts(k) = sum(sum( strcmp( code2count(k) , C(idxDateOk,:) ) ) ) ;
    fprintf( '%-10s   %d\n',code2count{k},counts(k) ) ;          %// display results
end

这个输出:

Code         Counts
P0702        3
P0882        0
P0883        0

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 2013-09-06
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    相关资源
    最近更新 更多