【问题标题】:Preventing Matlab from truncating timestamp when importing from excel从excel导入时防止Matlab截断时间戳
【发布时间】:2015-07-26 22:06:49
【问题描述】:

我正在将时间戳的 excel 文件导入 Matlab。似乎每当我在午夜时分有一个时间戳,即“13/5/2015 12:00 PM”时,我的 matlab 只会将其读取为“2015 年 13 月 5 日”。

Excel samples
'13/5/2015 12:00 PM'
'13/5/2015 12:01 PM'

使用 [NA1, NA2, Raw] = xlsread('excel.xls'); 导入 Matlab

Raw = {
'13/5/2015';
'13/5/2015 12:01 PM'}

这实际上阻止了我使用相同格式的 datenum。从excel导入时如何防止Matlab截断时间戳?

【问题讨论】:

  • 我的建议对你有帮助吗?
  • 谢谢!你的建议有帮助

标签: matlab timestamp


【解决方案1】:

您始终可以自己添加时间,方法是找到那些以字母结尾的条目并在字符串末尾添加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 的目标是在每个字符串中找到该模式匹配的 locations。在这种情况下,我正在做的是找到那些以数字结尾的字符串。如果我没有找到这样的模式,那么结果将为空。因此,如果您提供一个字符串元胞数组,您将获得另一个元胞数组作为输出,其中每个元素告诉您找到模式的索引。

因此,如果我们获得一个字符串的索引,这意味着它以数字结尾,如果它是空的,那么它以数字结尾。我使用cellfun 遍历regexp 结果并返回一个logical 向量,该向量确定每个单元格数组是空的还是里面有东西。但是,我想要相反的,这就是为什么我采用相反的 (~)。我现在可以使用这个输出切入 Raw 单元格数组,并挑选出那些以数字结尾的字符串。

切片是在第二行代码中完成的。取出这些字符串后,我运行另一个cellfun(第三行)调用,在字符串末尾附加一个12:00 AM 字符串,并将uni=0 标志设置为输出是一个单元格数组 不再是简单的数字/逻辑数组。一旦我从第三行获得了这个输出元胞数组,我就使用第一行代码中的索引切回原始元胞数组并将这些填充字符串放入其中。

在您的示例元胞数组上运行上述代码后,我会得到:

Raw = 

    '13/5/2015 12:00 AM'
    '13/5/2015 12:00 PM'

【讨论】:

  • 看起来 regexp 在这种情况下是一个很好的函数。感谢您的解释。
  • 完全没问题。很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2018-07-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 2020-10-21
  • 2019-05-10
相关资源
最近更新 更多