我有一个相当简单的问题:我有一个看起来像这样的细胞载体:
temp_y_date{1} = '2012Q2'
temp_y_date{2} = '2012Q1'
temp_y_date{3} = '2011Q4'
我想使用函数datenum将此单元格向量转换为日期向量。我首先将矢量转换为'QQ -YYYY'格式,如下所示:
for i = 1:length(temp_y_date)
temp = temp_y_date(i);
year = cellfun(@(c) {c(1:4)}, temp);
quarter = cellfun(@(c) {c(5:6)}, temp);
temp_y_date(i) = strcat(quarter,'-',year);
end
temp_y_date的值现在是
temp_y_date (1) = 'Q2-2012'
temp_y_date (2) = 'Q1-2012'
temp_y_date (3) = 'Q4-2011'
我以为我现在可以应用datenum函数:
temp_y_date = datenum(temp_y_date,'QQ-YYYY');
然而,我收到错误:
??? Error using ==> datenum at 178
DATENUM failed.
Caused by:
Error using ==> dtstr2dtnummx
Failed on converting date string to date number.
答案 0 :(得分:0)
我在R2009b和R2012a上进行了测试。你的代码适用于后者,但我在R2009b中得到了同样的错误。
当我在temp_y_date
中放弃Q时,它已在旧版本中修复。显然旧版本不接受四分之一定义。
工作代码:
strdate = {'2012Q2', '2012Q1', '2011Q4'};
strdate2 = cellfun(@(c) strcat(c(6),'-',c(1:4)),strdate,'uni',false);
result = datenum(strdate2,'QQ-YYYY');
我改变了你的变量名,所以它更容易调试。还修复了包含cellfun的循环,你使用它的效率非常低。我建议你了解一个单元是什么,以及如何索引它。
注意:如果您升级到其他版本,或者其他人在更高版本中使用它,则此将中断。所以,如果您不想这样,我建议您使用verLessThan来区分不同版本的matlab:
来自help datenum
:
DATENUM不接受带有'Q'的格式。
所以我想你必须自己升级或实现这个,但看起来并不那么难:
strdate = {'2012Q2', '2012Q1', '2011Q4'};
if verLessThan('matlab','7.12') % or maybe 7.11, it depends on which version the datenum functionality changed...
strdate2 = cellfun(@(c) sprintf('%s/%02d/01',c(1:4),3*str2double(c(6))-2),strdate,'uni',false);
result = datenum(strdate2,'YYYY/mm/dd');
else
strdate2 = cellfun(@(c) strcat(c(5:6),'-',c(1:4)),strdate,'uni',false);
result = datenum(strdate2,'QQ-YYYY');
end
正如您所看到的,旧版本的datenum需要完整的日期规范:'YYYY / mm / dd'。