我正在将一个excel的时间戳文件导入Matlab。似乎每当我在午夜时分有一个时间戳,即'13 / 5/2015 12:00 PM',我的matlab将只读它'13 / 5/2015'。
Excel samples
'13/5/2015 12:00 PM'
'13/5/2015 12:01 PM'
使用[NA1,NA2,Raw]导入Matlab = xlsread('excel.xls');
Raw = {
'13/5/2015';
'13/5/2015 12:01 PM'}
这实际上阻止了我使用相同格式的datenum。从excel导入时,如何防止Matlab截断时间戳?
答案 0 :(得分:2)
您可以通过查找不以字母结尾的条目并在字符串末尾添加12:00 AM
来自行添加时间。然后可以将其用于datenum
。为此,我们可以使用regular expressions并搜索最后没有任何字母的单元格,然后对于每个单元格,最后添加12:00 AM
。
这样的事情:
ind = ~cellfun(@isempty, regexp(Raw, '\d*$'));
strings = Raw(ind);
padded_strings = cellfun(@(x) [x ' 12:00 AM'], strings, 'uni', 0);
Raw(ind) = padded_strings;
第一行代码有点混淆,但很容易解释。让我们先看一下嵌套命令:
regexp(Raw, '\d*$')
regexp
是MATLAB的正则表达式命令。正则表达式寻求在字符串中查找模式。你在这里做的是指定一个字符串或字符串的单元格数组,regexp
的目标是找到每个字符串中该模式匹配的位置的位置。在这种情况下,我正在做的是找到以数字结尾的字符串。如果我不找到这样的模式,那么结果将为空。因此,如果你提供一个字符串的单元格数组,你会得到另一个单元格数组作为输出,其中每个元素告诉你找到模式的位置索引。
因此,如果我们获得一个字符串的索引,这意味着它以数字结尾,如果它是空的,那么它以数字结束。我使用cellfun
遍历regexp
结果并返回logical
向量,该向量确定每个单元格数组是否为空或者其中包含某些内容。但是,我想要相反,这就是我采用逆(~
)的原因。我现在可以使用此输出切入Raw
单元格数组,并选出最后以数字结尾的字符串。
切片在第二行代码中完成。一旦我拿出这些字符串,我运行另一个cellfun
(第三行)调用,在字符串的末尾附加一个12:00 AM
字符串,并设置uni=0
标志,因为输出是一个单元格数组,不再是简单的数字/逻辑数组。一旦我从第三行获得了这个输出单元格数组,我就会使用第一行代码中的索引切换回原始单元格数组,并将这些填充的字符串放在里面。
在我的示例单元格数组上运行上面的代码后,我得到了这个:
Raw =
'13/5/2015 12:00 AM'
'13/5/2015 12:00 PM'