展开数据枚举向量



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

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

,然后尝试创建所需的日期序列

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

适用于前几个条目,但随后偏离了我的期望。我得到的结果是(为了方便查看,minutes列稍微整理了一下)

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

而我想要/期望的是

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

我做错了什么?

没有'漂移'。只是在某个时刻,你的20分钟间隔开始被表示为19分60秒(=20分钟)。

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

PS:"20分钟表示为24小时的一小部分";是简单的20 / 24 / 60。实际上不需要第一行

我通过"清理"解决了我的问题。输出。"cleaning"代码如下,

## 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的回答-重要的是要获得正确的格式,因为稍后在我的代码中,我使用带有可选的"rows"的ismember函数。参数,因此不同行的格式必须匹配。

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

最新更新