Sch*_*hae 3 matlab timestamp time-series data-mining matlab-table
我有两个表A和B.我想根据它们的有效时间间隔加入它们.
A具有产品质量(不规则时间),B在生产期间具有每小时设置.我需要创建一个像C这样的表,其中包含所有A的RefDates的参数p1和p2,这些参数位于B的ValidFrom ValidTo的时间范围内.
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
Run Code Online (Sandbox Code Playgroud)
我需要得到这样的东西.
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
Run Code Online (Sandbox Code Playgroud)
我知道如何在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
Run Code Online (Sandbox Code Playgroud)
这实际上可以在一行代码中完成.假设您的ValidTo值始终ValidFrom在下一行(在您的示例中执行)之前结束,您只需要使用您的ValidFrom值.首先,使用将这些和您的RefDate值转换为序列号datenum.然后使用该discretize函数RefDate将ValidFrom值作为边缘来对值进行分级,这将为您提供B每次包含的行索引A.然后使用该索引提取p1和p2值并将它们附加到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
Run Code Online (Sandbox Code Playgroud)
上述解决方案应该适用于任何数量的列pN在B.
如果有任何时间A不属于任何范围B,则必须将解决方案分成多行,以便检查返回的索引是否discretize包含NaN值.假设您要从中排除这些行C,这将是新的解决方案:
index = discretize(datenum(A.RefDate), datenum(B.ValidFrom));
C = [A(~isnan(index), :) B(index(~isnan(index)), 3:end)];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |