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

时间:2016-02-12 00:02:10

标签: 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'};

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

ismember(type_1,type_2)

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

3 个答案:

答案 0 :(得分: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');

datestr需要MATLAB日期编号才能输出日期的字符串表示。这就是使用datenum的原因,您可以看到,即使我们为月份或日期指定了两位数字,但如果这些数量有一个数字并且日期编号已成功转换。然后,我们会使用这些日期数字输入datestr,以确保在需要时我们有额外的零。

但是,这会将单元格数组转换为字符数组。您必须使用cellstr

将它们放回到单元格数组中
type_1 = cellstr(type_1);
type_2 = cellstr(type_2);

这里有一些示例输出:

>> 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

答案 1 :(得分: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));

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

答案 2 :(得分:3)

“现代”(R2014b +)的方式是使用MATLAB的datetime类,如下所示:

>> dt1 = datetime(type_1, 'InputFormat', 'dd.MM.yyyy')
dt1 = 
   23-Feb-2005   23-Apr-2015   05-Jan-2015
>> dt2 = datetime(type_2, 'InputFormat', 'dd.MM.yyyy')
dt2 = 
   23-Feb-2005   23-Apr-2015   05-Jan-2015
>> ismember(dt1, dt2)
ans =
     1     1     1