如何在Matlab中预分配日期时间数组

4
我想知道在Matlab中是否有一种方法来预分配一个datetime数组。
我解释一下我的问题:我需要从许多文件(假设有100个)中读取几个日期(假设有10个),并希望将其存储在一个10X100的datetime数组中。如果我的数据是简单的数字日期(即double),我可以预分配一个数组,如:DataTable = zeros(10,100)。我想用类似的方式处理datetime数据类型,但我找不到如何做到这一点,请你帮帮我?
可能的解决方案/解决方法:
我进行了一些测试,并找到了这个解决方法:
DataTable = repmat(datetime(0,0,0), 10, 100);

从一开始,我就有一个10X100的datetime数组,初始化为默认值。我在问题中发布了这个编辑,以便对某些人有所帮助。

4个回答

6

编辑(更好的解决方案):

我最近发现了另一种选择,即使用在R2015b中引入的NaT()函数(@csanchisb在他的答案中也提到了)。NaT代表“不是时间”,类似于浮点值的NaN。这可能是最好的解决方案,因为它使用了一个内置函数,可以完全满足您的要求,并且还清楚地指示了矩阵的哪些条目未设置为有效的日期时间值。

DataTable = NaT(10,100);

运行上述代码后,您可以循环遍历并覆盖DataTable中的每个条目,将其替换为读取到的实际datetime对象。原作者贴出的使用repmat()的解决方案在大多数情况下可能是最好的,但这里提供另一种可能的解决方案:
DataTable = datetime(zeros(10,100), zeros(10,100), zeros(10,100));

或者
DataTable = zeros(10,100);
DataTable = datetime(DataTable, DataTable, DataTable);

我写了一些快速代码来比较这种方法和作者的repmat()方法的性能。看起来这种方法对于小数组(约100个日期时间对象)的速度略快,但是对于大数组(约1百万个日期时间对象),repmat()要快得多。

然而,由于预分配通常只发生一次,因此速度可能并不像语义清晰的代码那么重要。在这种情况下,我仍然会选择repmat()解决方案,因为我认为它更容易解释其代码在做什么。


3
datetime(0, 0, 0)将会生成30-Nov--0001,这是一个不错的默认值。构建数组的明显方法是repmat(datetime(0, 0, 0), 10, 100)
另一种选择是使用NaT('not a time'),它是datetime类型,更加明显地是一个默认值。在这种情况下,您可以直接用NaT(10, 100)初始化数组。

+1 对于 NaT 版本,非常优雅!在我的机器上,与 repmat(datetime(0, 0, 0), 10, 100) 相比,这大约快了两倍。 - winkmal

3
你可以初始化一个空的:
DataTable = datetime([],[],[]);

然后找到一些聪明的方法来填充它。这意味着您可以根据算法需求动态添加元素。

您确定使用全零固定数组有意义吗?


感谢@sparaflAsh提供的解决方案。我最初有一个1X1的日期时间DataTable。我知道可以动态添加元素,但我想知道是否可以从头开始创建具有最终维度的DataTable - MeSS83
1
好的。这台机器上没有Matlab,但我想你可以尝试一下datetime的算术运算。详情请见这个例子可能会对你有所帮助:在t1的基础上加上若干天`t1 = datetime('now'); t3 = t1 + caldays(0:2) t3 = 08-Mar-2014 00:00:00 09-Mar-2014 00:00:00 10-Mar-2014 00:00:00` - sparaflAsh

0
您可以像这样使用“单元数组”:
DataTable = cell(10,100); 

使用大括号填充每个单元格。

例如:DataTable{2,3}='2015-12-2';


您说得没错,但在这种情况下,我有一个单元格且丢失了日期时间数据类型。 - MeSS83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接