我有一年的以下数据,结构如此。这是一个实例的示例。该数据也存储在文本文件中。
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
请帮忙。谢谢!
答案 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
可以是80
或A
来表示字符P
或A(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中任何足够大的数字的默认表示。