我需要创建一个bin列表,在其中我将一个日期时间列表与另一个不同大小的日期时间列表进行测试。基本上,我有一个更大的列表(tb_date-81504个样本(,想知道一些日期时间(较小的列表-(useful_date-42443个样本((在其中的位置-如果较小的列表中没有日期,则返回零,如果存在,则返回1-创建一个由0或1组成的tb_date大小的新列表(项目1不存在,0,项目2存在,1,依此类推。。我制作了:
[m,n] = size(tb_date);
[i,j] = size(useful_date);
tb_useful_ind = []
for k = 1:n
for i = 1:j
if tb_date(k) == useful_date(j)
tb_useful_ind(k) = 1;
else
tb_useful_ind(k) = 0;
end
end
end
然后,返回tb_date:中的索引
date_indexes = find(tb_useful_ind);
但这样使用是不可能的——它给我带来了错误的价值观,而且需要很长时间。。(跑了9个小时,只跑了5公里(。。你建议我怎么做?
非常感谢。
更新:我尝试使用intersect:
>> intersect(tb_date,datetime_day); useful_date2 = ans;
>> B = tb_date == useful_date2;
Data inputs must be the same size, or any of them can be a scalar.
也尝试过:
ind=find(tb_date==useful_date);
Data inputs must be the same size, or any of them can be a scalar.
我需要获得一个大小相同的tb_date列表(81504(,其中tb_date的每个元素都会被检查是否在useful_date中,如果元素不在,则返回0,如果元素在,则为1。例如:
tb-date = '01-Jan-2016 00:00:00' '01-Jan-2016 00:15:00' '01-Jan-2016 00:30:00' '01-Jan-2016 00:45:00' '01-Jan-2016 01:00:00' '01-Jan-2016 01:15:00' '01-Jan-2016 01:30:00' '01-Jan-2016 01:45:00' '01-Jan-2016 02:00:00' '01-Jan-2016 02:15:00' '01-Jan-2016 02:30:00' '01-Jan-2016 02:45:00' '01-Jan-2016 03:00:00'
useful_date = '01-Jan-2016 01:00:00' '01-Jan-2016 01:15:00' '01-Jan-2016 01:30:00'
大致来说,我需要的输出是:
date_indexes=(0 0 0 1 1 1 0 0 0 0(
您可以执行一个集合交集来查找公共值,这将不包括任何重复值。例如,我将使用随机生成日期时间值:
>> timepoint = datetime("now")
timepoint =
datetime
21-Aug-2020 00:16:21
>> dates_1 = reshape(randi(30, 10) + timepoint, [1 100]); dates_2 = reshape(randi(30, 10) + timepoint, [1 100]);
>> intersect(dates_1, dates_2)
ans =
29×1 datetime array
22-Aug-2020 00:16:21
23-Aug-2020 00:16:21
24-Aug-2020 00:16:21
25-Aug-2020 00:16:21
26-Aug-2020 00:16:21
27-Aug-2020 00:16:21
28-Aug-2020 00:16:21
...
编辑:
如果您想找到它们的位置,可以使用find
,循环使用usefuldates datetime数组中的每个元素,然后运行find(tb_dates == element)
。或者,intersect可选地返回两个附加参数[C,ia,ib] = intersect(___)
,这两个参数是两个数组中公共值的索引。