展开一个 datenum 向量

Expand a datenum vector

我正在尝试创建一系列 datevec 日期和时间,间隔 20 分钟,分钟列恰好为 0、20 和 40,并具有给定的开始和结束时间。首先我创建一个 20 分钟的差异值

datenum_20_min_diff = datenum( [ 2021 , 1 , 27 , 17 , 0 ] ) - datenum( [ 2021 , 1 , 27 , 16 , 40 ] ) ;

然后尝试创建所需的 datevec 系列

s = datevec( ( datenum([2021,1,27,22,0]) : datenum_20_min_diff : datenum([2021,1,28,11,0]) )' ) ;

这适用于前几个条目,但后来偏离了我的预期。我得到的是(为了便于查看,会议记录栏稍微整理了一下)

2.0210e+03   1.0000e+00   2.7000e+01   2.2000e+01    0            0
2.0210e+03   1.0000e+00   2.7000e+01   2.2000e+01   20            0
2.0210e+03   1.0000e+00   2.7000e+01   2.2000e+01   40            0
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01    0            0
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01   19   6.0000e+01
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01   39   6.0000e+01
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01   59   6.0000e+01

而我want/expected是

2.0210e+03   1.0000e+00   2.7000e+01   2.2000e+01    0   0
2.0210e+03   1.0000e+00   2.7000e+01   2.2000e+01   20   0
2.0210e+03   1.0000e+00   2.7000e+01   2.2000e+01   40   0
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01    0   0
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01   20   0
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01   40   0       
2.0210e+03   1.0000e+00   2.7000e+01   2.3000e+01    0   0

我做错了什么?

没有'drift'。只是在某个时候,您的 20 分钟间隔开始表示为 19 分 60 秒(=20 分钟)。

我不知道为什么,但理论上两者是等价的,你不应该关心它。如果您担心 'formatting' 日期以获得更具视觉意义的输出,请使用格式化功能。例如。 datestr(s) 会给你你所期望的。

PS:“20 分钟表示为 24 小时的一小部分”很简单 20 / 24 / 60。不需要第一行。

我已经通过“清理”输出解决了我的问题。 “清理”代码如下所示,

## create a new_date_vec
new_date_vec = datevec( ( datenum(data_ordbk_last) : datenum_20_min_diff : datenum(recent_update_time) )' ) ;

## and clean it up
seconds_60 = find( new_date_vec( : , 6 ) != 0 ) ; new_date_vec( seconds_60 , 6 ) = 0 ; 
minutes_19 = find( new_date_vec( : , 5 ) == 19 ) ; new_date_vec( minutes_19 , 5 ) = 20 ;
minutes_39 = find( new_date_vec( : , 5 ) == 39 ) ; new_date_vec( minutes_39 , 5 ) = 40 ;
minutes_59 = find( new_date_vec( : , 5 ) == 59 ) ; new_date_vec( minutes_59 , 5 ) = 0 ;
new_date_vec( minutes_59 , 4 ) = new_date_vec( minutes_59 , 4 ) .+ 1 ;
hours_24 = find( new_date_vec( : , 4 ) == 24 ) ; new_date_vec( hours_24 , 4 ) = 0 ;
new_date_vec( hours_24 , 3 ) = new_date_vec( hours_24 .+ 1 , 3 ) ;

以我想要的格式输出。

回复:Tasos Papastylianou 的回答 - 获得正确的格式很重要,因为稍后在我的代码中我使用带有可选“行”参数的 ismember 函数,因此不同行的格式必须匹配。

回复:Tasos Papastylianou 的评论 - 这是一个更大项目的一部分,我在该项目中读取了文件的最后一行,其中日期和时间以 datevec 形式表示,并且最终将附加新的、处理过的数据.使用 datvec 格式似乎更容易,特别是因为通过在 datevec 列中查找特定值来进行上述处理更容易。也可以更轻松地查看 datevec 数据并检查代码是否按预期工作,并且不会潜在地导致处理管道的进一步问题,就像我对原始问题所做的那样。