String 将单元格日期转换为datenum,将空值转换为NaN
我将一些数据从sql数据库下载到6000 x 5的单元格中。我希望将2:end列转换为datenum。在这四列中,数据库中的一些日期为空,请参见下面我正在下载的数据示例。我希望这些空日期为NaN或零String 将单元格日期转换为datenum,将空值转换为NaN,string,matlab,date,cell-array,String,Matlab,Date,Cell Array,我将一些数据从sql数据库下载到6000 x 5的单元格中。我希望将2:end列转换为datenum。在这四列中,数据库中的一些日期为空,请参见下面我正在下载的数据示例。我希望这些空日期为NaN或零 '100364MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null' '100377MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100364MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100377MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100394MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100395MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100996MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'
'101005MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'
我一直在玩下面的几行,但是我收到一条错误消息,说DATENUM失败了。我猜这是因为“空”吗
my_dates = zeros(6000, 5)
my_dates = cellfun(@datenum, data_matrix(:, 2:end));
问题是datenum在发现不一致的字符串时立即退出,并出现错误。所以,在你的情况下,很难用矢量化的方式来做,很难
下面是一个快速而肮脏的解决方案,其中包含try和for循环:
首先定义数据:
d = {'100364MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100377MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100394MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100395MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100996MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'
'101005MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'};
然后:
这给
result =
NaN NaN 729542 729542 NaN
NaN NaN 729542 729542 NaN
NaN NaN 729542 729542 NaN
NaN NaN 729542 729542 NaN
NaN NaN 729572 729572 NaN
NaN NaN 729572 729572 NaN
问题是datenum在发现不一致的字符串时立即退出,并出现错误。所以,在你的情况下,很难用矢量化的方式来做,很难
下面是一个快速而肮脏的解决方案,其中包含try和for循环:
首先定义数据:
d = {'100364MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100377MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100394MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100395MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100996MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'
'101005MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'};
然后:
这给
result =
NaN NaN 729542 729542 NaN
NaN NaN 729542 729542 NaN
NaN NaN 729542 729542 NaN
NaN NaN 729542 729542 NaN
NaN NaN 729572 729572 NaN
NaN NaN 729572 729572 NaN
矢量化方法-
%// a1 is the input cell array
a1= {
'100364MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100377MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100394MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100395MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100996MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'
'101005MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'}
ind1 = ~strcmp(a1,'null')
a1(~ind1)={NaN}
ind1(:,1)=false
%// Choose one of the following two, as the output format demands
a1(ind1) = num2cell(datenum(a1(ind1))) %// datenum as cells of double
a1(ind1) = cellstr(num2str(datenum(a1(ind1)))) %// datenum as cells of strings
输出-
备选案文1:
a1 =
'100364MM' [NaN] [729542] [729542] [NaN]
'100377MM' [NaN] [729542] [729542] [NaN]
'100394MM' [NaN] [729542] [729542] [NaN]
'100395MM' [NaN] [729542] [729542] [NaN]
'100996MM' [NaN] [729572] [729572] [NaN]
'101005MM' [NaN] [729572] [729572] [NaN]
备选案文2:
a1 =
'100364MM' [NaN] '729542' '729542' [NaN]
'100377MM' [NaN] '729542' '729542' [NaN]
'100394MM' [NaN] '729542' '729542' [NaN]
'100395MM' [NaN] '729542' '729542' [NaN]
'100996MM' [NaN] '729572' '729572' [NaN]
'101005MM' [NaN] '729572' '729572' [NaN]
矢量化方法-
%// a1 is the input cell array
a1= {
'100364MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100377MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100394MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100395MM' 'null' '1997-06-01 00:00:00.0' '1997-06-01 00:00:00.0' 'null'
'100996MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'
'101005MM' 'null' '1997-07-01 00:00:00.0' '1997-07-01 00:00:00.0' 'null'}
ind1 = ~strcmp(a1,'null')
a1(~ind1)={NaN}
ind1(:,1)=false
%// Choose one of the following two, as the output format demands
a1(ind1) = num2cell(datenum(a1(ind1))) %// datenum as cells of double
a1(ind1) = cellstr(num2str(datenum(a1(ind1)))) %// datenum as cells of strings
输出-
备选案文1:
a1 =
'100364MM' [NaN] [729542] [729542] [NaN]
'100377MM' [NaN] [729542] [729542] [NaN]
'100394MM' [NaN] [729542] [729542] [NaN]
'100395MM' [NaN] [729542] [729542] [NaN]
'100996MM' [NaN] [729572] [729572] [NaN]
'101005MM' [NaN] [729572] [729572] [NaN]
备选案文2:
a1 =
'100364MM' [NaN] '729542' '729542' [NaN]
'100377MM' [NaN] '729542' '729542' [NaN]
'100394MM' [NaN] '729542' '729542' [NaN]
'100395MM' [NaN] '729542' '729542' [NaN]
'100996MM' [NaN] '729572' '729572' [NaN]
'101005MM' [NaN] '729572' '729572' [NaN]