我正在阅读一堆excel文件,并使用matlab将它们加载到SQL数据库中。我正在读取列作为单元格数组,然后我想通过并删除“dateColumn”列日期值不正确的行。
目前,我正在制作一个布尔值的向量,其中1表示日期是好的:
arrayOfBools = cellfun(@(x) ~isnan(datenum(x)),dateColumn);
然后用该向量截断其余列。例如:
Ticker = Ticker(arrayOfBools);
问题是我在每个电子表格中有35,000行,而arrayOfBools = cellfun(@(x)~isnan(datenum(x)),dateColumn);需要55秒,考虑到我必须经历的电子表格数量,这太长了。有没有办法可以更有效地做到这一点?
答案 0 :(得分:1)
您应该能够将字符串dateColumn
的单元格数组直接传递给DATENUM,而不必使用CELLFUN,这可能会提高您的速度:
arrayOfBools = ~isnan(datenum(dateColumn));
但是,DATENUM似乎在最近的一些修订中经历了一些更新,因此它的行为(以及上述解决方案的有效性)将在很大程度上取决于您使用的MATLAB版本。在最新版本(R2011a)中,似乎将字符串的单元格数组作为输入传递将返回转换后的数据字符串的字符数组,而不是日期数字的向量(请参阅{{中的最后一个示例) 3}})。这与R2010b不同,R2010b传递字符串的单元格数组会返回日期数字的向量。
但是,在R2010b中尝试一些不同的日期字符串时,我从来没有因无效的日期字符串而导致Examples section。它只是抛出一个错误。我猜你正在运行的代码(查找NaN
输出)是用于较旧的MATLAB版本。您应该在问题中指定该版本以及一些示例代码,以便我们帮助您。