创建日期矢量时的舍入问题



我想在matlab中创建一个包含日期的向量。为此,我指定了开始时间和停止时间:

WHM01_start = datenum('01-JAN-2005 00:00')
WHM01_stop = datenum('01-SEP-2014 00:00')

然后我用创建了矢量

WHM01_timevec = WHM01_start:datenum('01-JAN-2014 00:20') - datenum('01-JAN-2014 00:00'):WHM01_stop;

之后,我希望每个时间步长为20分钟。不幸的是,我在数千个值后出现了舍入错误,导致我进入

>> datestr(WHM01_timevec(254160))
ans =
31-Aug-2014 23:39:59

与预期不同,31-Aug-2014 23:40:00
如何更正这些不正确的值?

编辑:我也看到了这个线程,但不幸的是,我得到了每个日期的矢量,而不是所需的数字。

您可以给出年、月、日。。。以数字格式转换为函数CCD_ 2。Datenum接受一个或多个参数的矢量,如果数字太大(例如120分钟),datenum知道该怎么处理它

因此,通过以20分钟为增量提供分钟矢量,可以避免舍入误差(至少在1秒的水平上):

WHM01_start = datenum('01-JAN-2005 00:00');
WHM01_stop = datenum('01-SEP-2014 00:00');
time_diff = WHM01_stop - WHM01_start;
WHM01_timevec = test = datenum(2005,01,01,00,[00:20:time_diff*24*60],00);
datestr(WHM01_timevec(254160))

回答您的意见:

你看到舍入错误的原因是你使用了两个大数字的差作为时间增量。大数字的差值有(相对)大的舍入误差。

Matlab时间以自(虚构)日期0.0.000起的天数为单位。您的时间增量为1/3小时,即1/(24*3)天。修改您的原始代码,使其读取

WHM01_timevec = WHM01_start:1/(24*3):WHM01_stop;

是减少舍入误差的另一种方法,但对于大得离谱的时间跨度,第一种解决方案是一种更稳健的方法。

相关答案:使用linspace而不是冒号运算符:

%// given
WHM01_start = datenum('01-JAN-2005 00:00')
WHM01_stop = datenum('01-SEP-2014 00:00')
%// number of elements
n = numel(WHM01_start: datenum('01-JAN-2014 00:20') - ...
                       datenum('01-JAN-2014 00:00') : WHM01_stop);
%// creating vector using linspace
WHM01_timevec = linspace(WHM01_start, WHM01_stop, n);
%// proof
datestr(WHM01_timevec(254160))

ans =
31-Aug-2014 23:40:00

这个解决方案的缺点是:为了确定输出向量的元素数量,我使用用:创建的原始向量,这可能不是最好的选择。


链接答案中的重要引述:

使用linspace可以降低这些问题发生的概率,这不是一种安全性

相关内容

  • 没有找到相关文章

最新更新