使用sscanf扫描日期

时间:2014-08-06 03:49:12

标签: string matlab scanf

我有一年的以下数据,结构如此。这是一个实例的示例。该数据也存储在文本文件中。

1/1/2013  3:00:00 AM

我如何阅读这些数据?这是我到目前为止,我得到一个错误说:

  

在作业A(I)= B中,B和I中的元素数必须相同。

这是我写的代码:

for i = 1:k
    str = dateAndTime{i,1};
    [A, count]=sscanf(str,'%u/%u/%u %u:%u:%*u %*c'); % month day year hour minutes seconds pm/am
    dateNumber(i) = datenum([A(3) A(1) A(2) A(4) A(5) 0 0]); % Y M D H M S PM/AM datenum returns decimal day 
end

请帮忙。谢谢!

1 个答案:

答案 0 :(得分:2)

您的sscanf声明稍有不正确。当您在秒字段中阅读时,如果不应该是*,则会错误地放置*。您还想要删除AM/PM以确定字符A。您真正需要的只是第一个字符P*。您想摆脱A的原因是因为您想在矩阵sscanf中读取一个每个元素的数字。

当您执行此操作并运行A时,我们会为[A, count]=sscanf('1/1/2013 3:00:00 AM','%u/%u/%u %u:%u:%u %c'); A = 1 1 2013 3 0 0 65 获取以下矩阵,并以您帖子中的数据为例:

A(1)

正如您可以看到A(2)是月份,A(3)是一天,A(4)是年份,A(5)是小时,A(6)是分钟和A(7)是第二个。 65可以是80A来表示字符PA(7) = 80,因为这些是每个字符的ASCII代码。因此,如果datenum,我们需要在小时数中添加12来表示这是在下午。 for i = 1:k str = dateAndTime{i,1}; [A, count]=sscanf(str,'%u/%u/%u %u:%u:%u %c'); % month day year hour minutes seconds pm/am if (A(7) == 80) %// Check if it's in the morning or afternoon hour = 12; else hour = 0; end dateNumber(i) = datenum(A(3),A(1),A(2),A(4)+hour,A(5),A(6)); % Y M D H M S PM/AM datenum returns decimal day end 似乎没有采用第七个变量来表示它是在早上或下午,所以我们需要通过添加到小时来表示这一点。

因此,修改你的循环,使它看起来像这样:

dateAndTime = {'1/1/2013  3:00:00 AM'; '1/1/2013  3:00:00 PM'};
k = numel(dateAndTime);

为了测试这一点,让我们看看当我们使用相同的字符串时会发生什么,但是在AM和PM中都是如此:

dateNumber

使用上述内容,我们得到以下输出存储在dateNumber = 735235.13 735235.63

format bank

确保你{{1}}这样你可以实际看到它,或者它将使用指数表示法打印,因为这是MATLAB中任何足够大的数字的默认表示。