展开一个 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 数据并检查代码是否按预期工作,并且不会潜在地导致处理管道的进一步问题,就像我对原始问题所做的那样。
我正在尝试创建一系列 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 数据并检查代码是否按预期工作,并且不会潜在地导致处理管道的进一步问题,就像我对原始问题所做的那样。