我有以下一年的数据是这样的结构。这是一个实例的例子。此数据还存储在文本文件中。
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请帮帮忙。谢谢!
发布于 2014-08-06 04:50:30
您的sscanf语句略有错误。当您在秒字段中阅读时,在不应该有*的情况下,您错误地放置了一个one。您还需要去掉用于确定字符*的AM/PM。您真正需要的是第一个字符A或P。您想要去掉*的原因是希望读取矩阵A中每个元素的一个数字。
当您这样做时,当您运行sscanf时,我们使用您在post中的数据作为示例,为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,因为这是每个字符的ASCII代码。因此,如果是A(7) = 80,我们需要在小时数中添加12,以表示这是在下午。datenum似乎没有第七个变量来表示它是在上午还是下午,所以我们需要通过增加小时来表示这一点。
因此,修改您的循环,使其看起来如下:
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为了测试这一点,让我们看看当我们使用相同的字符串时会发生什么,但是在AM和PM中:
dateAndTime = {'1/1/2013 3:00:00 AM'; '1/1/2013 3:00:00 PM'};
k = numel(dateAndTime);使用上面的内容,我们获得了存储在dateNumber中的以下输出
dateNumber =
735235.13 735235.63确保你做了format bank,这样你就可以看到它是这样的,否则它会用指数表示法打印,因为这是MATLAB中任何足够大的数字的默认表示形式。
https://stackoverflow.com/questions/25151922
复制相似问题