【问题标题】:how to logic test a datetime list against another datetime list of different size? MATLAB如何针对另一个不同大小的日期时间列表对日期时间列表进行逻辑测试? MATLAB
【发布时间】:2020-12-10 06:44:47
【问题描述】:

我需要创建一个 bin 列表,在其中针对另一个不同大小的 datetime 列表测试一个 datetime 列表。 基本上,我有一个更大的列表(tb_date - 81504 个样本)并且想知道一些日期时间(较小的列表 -(useful_date - 42443 个样本))位于它的位置 - 如果日期不存在于较小的列表中,则返回零,并且如果存在则为 1 - 创建一个由 0 或 1s 组成的 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 小时,只给了我 5k 个元素).. 请你推荐我怎么做?

非常感谢。

更新:我尝试使用相交:

>> 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 的每个元素是否在有用日期中,如果元素不在则返回 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 0 1 1 1 0 0 0 0 0 0)

【问题讨论】:

  • 不确定我是否正确理解了您的问题,也许您正在寻找set intersect。如果需要很长时间,这可能是因为您必须循环通过大约 30 亿个元素。
  • 请阅读preallocation。下面的解决方案很好,但是如果你只预分配输出数组,你的代码会快很多。

标签: matlab datetime for-loop if-statement indexing


【解决方案1】:

您可以通过set intersect 查找常用值,这将不包括任何重复值。例如,我将使用随机生成的日期时间值:

>> 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,遍历有用日期日期时间数组中的每个元素,然后运行find(tb_dates == element)。或者, intersect 可选地返回两个附加参数 [C,ia,ib] = intersect(___),它们是两个数组中公共值的索引。

【讨论】:

  • 您好,曼苏尔,非常感谢。我确实使用了 intersect 但它只返回日期时间值。它给了我另一个较小的日期时间列表,而不是与原始大集合相同大小的二进制对应。我试过:相交(tb_date,datetime_day);它给了我一个我称之为有用日期的列表。然后 B = tb_date == 有用日期;它返回错误:数据输入的大小必须相同,或者它们中的任何一个都可以是标量。
  • Mansoor,我按照你的解释使用了相交,非常感谢!你是一个救生员。 :)!谢谢!
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多