matlab - 如何通过匹配时间间隔连接 Matlab (2018) 中的表格?

标签 matlab timestamp time-series data-mining matlab-table

我有两个表A和B,我想根据它们的有效时间间隔加入它们。

A有产品质量(不定时),B有生产期间每小时的设置。我需要创建一个像 C 一样的表,其中包含属于 B 的 ValidFrom ValidTo 时间范围内的所有 A 的 RefDates 的参数 p1 和 p2。

A
RefDate                 result
'11-Oct-2017 00:14:00'  17
'11-Oct-2017 00:14:00'  19
'11-Oct-2017 00:20:00'  5
'11-Oct-2017 01:30:00'  25
'11-Oct-2017 01:30:00'  18
'11-Oct-2017 03:03:00'  28


B
ValidFrom               ValidTo                 p1  p2
'11-Oct-2017 00:13:00'  '11-Oct-2017 01:12:59'  2   1
'11-Oct-2017 01:13:00'  '11-Oct-2017 02:12:59'  3   1
'11-Oct-2017 02:13:00'  '11-Oct-2017 03:12:59'  4   5
'11-Oct-2017 03:13:00'  '11-Oct-2017 04:12:59'  6   1
'11-Oct-2017 04:13:00'  '11-Oct-2017 05:12:59'  7   9

我需要得到这样的东西。

C
RefDate                 res p1  p2
'11-Oct-2017 00:14:00'  17  2   1
'11-Oct-2017 00:14:00'  19  2   1
'11-Oct-2017 00:20:00'  5   2   1
'11-Oct-2017 01:30:00'  25  3   1
'11-Oct-2017 01:30:00'  18  3   1
'11-Oct-2017 03:03:00'  28  4   5

我知道如何在 SQL 中执行此操作,而且我想我已经弄清楚如何在 MatLab 中逐行执行此操作,但这速度非常慢。数据集相当大。我只是假设一定有一种我找不到的更优雅的方式。

导致我的许多方法失败的原因是 RefDate 列不是唯一的。

编辑: 真实的表有数千行和数百个变量。

C (in reality)
RefDate                 res res2 ... res200 p1  p2 ... p1000
11-Oct-2017 00:14:00    17                  2   1
11-Oct-2017 00:14:00    19                  2   1
11-Oct-2017 00:20:00    5                   2   1
11-Oct-2017 01:30:00    25                  3   1
11-Oct-2017 01:30:00    18                  3   1
11-Oct-2017 03:03:00    28                  4   5

最佳答案

这实际上可以在一行代码中完成。假设您的 ValidTo 值总是在下一行的 ValidFrom 之前结束(在您的示例中),您只需要使用 ValidFrom 值(value)观。首先,使用 datenum 将这些值和您的 RefDate 值转换为序列日期数字。 .然后使用 discretize函数使用 ValidFrom 值作为边缘对 RefDate 值进行分箱,这将为您提供 B 中的行索引,其中每次包含 A。然后使用该索引提取 p1p2 值并将它们附加到 A:

>> C = [A B(discretize(datenum(A.RefDate), datenum(B.ValidFrom)), 3:end)]

C = 

           RefDate            result    p1    p2
    ______________________    ______    __    __

    '11-Oct-2017 00:14:00'    17        2     1 
    '11-Oct-2017 00:14:00'    19        2     1 
    '11-Oct-2017 00:20:00'     5        2     1 
    '11-Oct-2017 01:30:00'    25        3     1 
    '11-Oct-2017 01:30:00'    18        3     1 
    '11-Oct-2017 03:03:00'    28        4     5 

上述解决方案适用于 B 中任意数量的列 pN

如果 A 中的任何时间不在 B 中的任何范围内,您必须将解决方案分成多行,以便您可以检查从 discretize 返回的索引是否包含 NaN 值。假设您想从 C 中排除这些行,这将是新的解决方案:

index = discretize(datenum(A.RefDate), datenum(B.ValidFrom));
C = [A(~isnan(index), :) B(index(~isnan(index)), 3:end)];

关于matlab - 如何通过匹配时间间隔连接 Matlab (2018) 中的表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52720105/

相关文章:

php - 如何使用php在两个日期之间生成随机日期?

python - 如何将整数时间戳转换为日期时间

javascript - Pandas 的时间序列

r - 如何在R中创建多变量 "ts"对象?

matlab - 在 3d 空间中的两个平面之间进行插值

python - MATLAB 多维矩阵到 NumPy 矩阵的转换

matlab - 实时视频输入中的像素 (MATLAB)

matlab - 从逻辑数组掩码 (MATLAB) 映射的另一个较小矩阵的值构建稀疏矩阵?

java - InfluxDB'请求选择其中时间>时间戳

python - 在 Pandas 中捕捉时间