【问题标题】:datenum conversion failed, string format is 'QQ-YYYY'datenum 转换失败,字符串格式为 'QQ-YYYY'
【发布时间】:2012-08-17 23:23:17
【问题描述】:

我有一个相当简单的问题:我有一个像这样的细胞向量:

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.

【问题讨论】:

  • 你用的是什么版本?我正在使用7.14.0.739 (R2012a),我得到:>> datenum(temp_y_date,'QQ-YYYY') ans = 734960 734869 734777

标签: matlab datetime date-format


【解决方案1】:

我在 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'。

【讨论】:

  • 非常感谢。万事如意!
  • 实际上,它运行没有错误,但结果不正确。基本上,一年中的所有日期都是当年 12 月 26 日。你能检查一下你是否也得到同样的东西吗?
  • 确实,R2012a 工作正常,我会再看看它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
相关资源
最近更新 更多