从 excel 导入时防止 Matlab 截断时间戳
Preventing Matlab from truncating timestamp when importing from excel
我正在将一个 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 截断时间戳?
您始终可以自己添加时间,方法是找到那些 不 以字母结尾的条目,然后在字符串末尾添加 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
结果和 return 一个 logical
向量来确定每个元胞数组是空的还是里面有东西。但是,我想要相反的,这就是为什么我取反(~
)。我现在可以使用此输出切入 Raw
元胞数组并挑选出那些以数字结尾的字符串。
那个切片是在第二行代码中完成的。一旦我得到这些字符串,我 运行 另一个 cellfun
(第三行)调用在字符串的末尾附加一个 12:00 AM
字符串,我将 uni=0
标志设置为输出是一个 元胞数组 而不再是一个简单的 numeric/logical 数组。从第三行获得此输出元胞数组后,我使用第一行代码中的索引切回原始元胞数组并将这些填充的字符串放入其中。
一旦我 运行 你的示例元胞数组上的上述代码,我得到了这个:
Raw =
'13/5/2015 12:00 AM'
'13/5/2015 12:00 PM'
我正在将一个 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 截断时间戳?
您始终可以自己添加时间,方法是找到那些 不 以字母结尾的条目,然后在字符串末尾添加 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
结果和 return 一个 logical
向量来确定每个元胞数组是空的还是里面有东西。但是,我想要相反的,这就是为什么我取反(~
)。我现在可以使用此输出切入 Raw
元胞数组并挑选出那些以数字结尾的字符串。
那个切片是在第二行代码中完成的。一旦我得到这些字符串,我 运行 另一个 cellfun
(第三行)调用在字符串的末尾附加一个 12:00 AM
字符串,我将 uni=0
标志设置为输出是一个 元胞数组 而不再是一个简单的 numeric/logical 数组。从第三行获得此输出元胞数组后,我使用第一行代码中的索引切回原始元胞数组并将这些填充的字符串放入其中。
一旦我 运行 你的示例元胞数组上的上述代码,我得到了这个:
Raw =
'13/5/2015 12:00 AM'
'13/5/2015 12:00 PM'