在MATLAB中比较两种类型的日期字符串

use*_*243 1 regex string matlab

假设我们有这两种类型的日期:

type_1 = {'23.2.2005', '23.4.2015', '5.1.2015'};

type_2 = {'23.02.2005', '23.04.2015', '05.01.2015'};
Run Code Online (Sandbox Code Playgroud)

当我们使用这个函数比较这两种类型时:

ismember(type_1,type_2)
Run Code Online (Sandbox Code Playgroud)

这两种类型中没有任何相等(因为添加了零type2).我们如何正确比较这两种类型?

ray*_*ica 6

另一种方法是使用datestrdatenum强制执行额外的零转换.

type_1 = datestr(datenum(type_1, 'dd.mm.yyyy'), 'dd.mm.yyyy');
type_2 = datestr(datenum(type_2, 'dd.mm.yyyy'), 'dd.mm.yyyy');
Run Code Online (Sandbox Code Playgroud)

datestr需要MATLAB日期编号才能输出日期的字符串表示.这就是为什么datenum使用,你可以看到,即使我们指定月或日的两位数,它足够聪明,如果这些数量有一个数字,并成功转换日期数字.然后我们使用这些日期编号进行管道输入,datestr以确保在需要时我们有额外的零.

但是,这会将单元格数组转换为字符数组.你必须使用以下方法将它们放回到单元格数组中cellstr:

type_1 = cellstr(type_1);
type_2 = cellstr(type_2);
Run Code Online (Sandbox Code Playgroud)

这是一些示例输出:

>> type_1 = {'23.2.2005', '23.4.2015', '5.1.2015'}

type_1 = 

    '23.2.2005'    '23.4.2015'    '5.1.2015'

>> type_2 = {'23.02.2005', '23.04.2015', '05.01.2015'}

type_2 = 

    '23.02.2005'    '23.04.2015'    '05.01.2015'

>> type_1 = datestr(datenum(type_1, 'dd.mm.yyyy'), 'dd.mm.yyyy')

type_1 =

23.02.2005
23.04.2015
05.01.2015

>> type_2 = datestr(datenum(type_2, 'dd.mm.yyyy'), 'dd.mm.yyyy')

type_2 =

23.02.2005
23.04.2015
05.01.2015

>> type_1 = cellstr(type_1)

type_1 = 

    '23.02.2005'
    '23.04.2015'
    '05.01.2015'

>> type_2 = cellstr(type_2)

type_2 = 

    '23.02.2005'
    '23.04.2015'
    '05.01.2015'

>> ismember(type_1, type_2)

ans =

     1
     1
     1
Run Code Online (Sandbox Code Playgroud)

  • 确实.我总是回到伟大的思想解释.+1 (3认同)
  • 我刚要张贴这个......:'( (2认同)
  • 可能值得注意的是,你可以直接比较`datenum`数量,如果以后不需要格式化的字符串(虽然我可能会这样做,但是有不同的格式会让我烦恼) (2认同)
  • @excaza我不确定是否需要OP给出的日期的确切表示,所以我决定转换回字符串的单元格数组以确定,但如果是我,我同意.我只是使用`datenum`并将其留在那里以便于比较日期. (2认同)

小智 5

这样可以避免使用regexp数字转换技巧:

del0str     = @(x) sprintf('%d.%d.%d',sscanf(x,'%d.%d.%d'));
del0cell    = @(x) cellfun(del0str, x, 'UniformOutput', false);
[ix1, ix2]  = ismember(del0cell(type_1), del0cell(type_2));
Run Code Online (Sandbox Code Playgroud)

请注意,无论日期中的订单或日/月/年,只要订单在两个单元格日期之间保持一致,此操作就会起作用.

  • @rayryeng谢谢!我会做*任何*以避免调试`regexp`,首先不写一个.:-D (3认同)
  • 关于那个真实的故事,@ rayryeng.它甚至看起来像`datetime`对象调用一个完整的解析器(我猜是因为它是一个mex文件)来创建字符串,这总是最好的(尽管并不总是实用). (2认同)