1

我有一个相当复杂的情况,并且是 SAS 的新手,我正在努力寻找解决方案。我有两个数据集(控制器、数据集),每个数据集中都有一个功率测量值。我需要将控制器数据与 daq 数据对齐。但是每个数据集中都有一个时间戳,他们没有费心将 daq 与控制器同步,因此两者之间存在不确定的时间增量。更复杂的是,两个系统都以不同的速率对数据进行采样......虽然控制器只在测试期间记录数据,但数据采集器的记录时间更长。因此,对于典型的测试运行,控制器有大约 1000 行数据,而 daq 在不同的采样率下有 30,000 行(这意味着绝对测量值可能不会完全匹配)。

我试图找出一种自动对齐数据的方法 - 即找出控制器数据的曲线与 daq 数据的曲线最接近的位置 - 给我们时间增量。

我目前的想法是遍历两个数组,从 controllerow[j] 中减去 daqrow[i],然后将曲线的增量相加并找到最小增量:

      set work.daqPower work.controlPower
array pwr_daq{*} daqPwr;  /* daqPwr is name of power variable in work.daqPower */
array pwr_control{*} controlPwr;  /* controllPwr is name of power variable in work.controlPower */
do idaq=1 to (30000 - 1000);
    x = idaq;
    tmp = 0;
    do jcontrol=1 to 1000;
        tmp = tmp + ABS(pwr_daq[x] - pwr_control[jcontrol]);
        x = x + 1;
    end;
    output;
end;

我显然不理解数组文档。我一直在网上搜索并浏览了很多示例,但我没有找到任何显示读取两个数据集并从中创建单独数组的示例。如果您有任何关于更好方法的想法,我将不胜感激任何类似示例的链接。

谢谢,

弗雷德

更新数据样本:

DateTime        daqPower
05JUL12:10:10:00    205.45687866211
05JUL12:10:10:00    204.33529663086
05JUL12:10:10:00    204.17504882813
05JUL12:10:10:00    203.53414916992
05JUL12:10:10:00    203.53414916992
05JUL12:10:10:00    204.81597900391
05JUL12:10:10:00    204.33529663086
05JUL12:10:10:00    205.13641357422
05JUL12:10:10:00    207.05914306641
05JUL12:10:10:00    206.73867797852
05JUL12:10:10:00    207.05914306641
05JUL12:10:10:00    208.50119018555
05JUL12:10:10:00    208.50119018555
05JUL12:10:10:00    207.53982543945
05JUL12:10:10:00    207.21936035156
05JUL12:10:10:00    206.73867797852
05JUL12:10:10:00    206.09777832031
05JUL12:10:10:00    205.77731323242
05JUL12:10:10:00    205.13641357422
05JUL12:10:10:00    205.45687866211

DateTime        controlPower
05JUL12:10:01:19    226.8705902
05JUL12:10:01:19    232.526886
05JUL12:10:01:19    236.9337006
05JUL12:10:01:19    242.3483887
05JUL12:10:01:19    246.9274292
05JUL12:10:01:19    246.3426819
05JUL12:10:01:19    244.3251495
05JUL12:10:01:19    242.6235352
05JUL12:10:01:20    243.5477753
05JUL12:10:01:20    240.9849854
05JUL12:10:01:20    230.8181458
05JUL12:10:01:20    225.579071
05JUL12:10:01:20    221.7199097
05JUL12:10:01:20    214.7053986
05JUL12:10:01:20    212.1452332
05JUL12:10:01:20    210.9714203
05JUL12:10:01:20    213.6631317
05JUL12:10:01:20    213.3510437
05JUL12:10:01:21    209.8970642
05JUL12:10:01:21    210.884964

请记住,时间不匹配(我们“听说”时间戳可能彼此不同步大约 10 分钟+)。关键是控制器的曲线比 daq 的间隔要短得多,我们试图通过对齐控制器曲线与控制器曲线最接近的位置来确定时间差。我说曲线,因为最初只是想匹配最大值,但是虽然控制器数据中只有一个最大值,但 daq 数据会持续更长的时间,并且功率曲线多次穿过该值,所以它会很难仅基于此对齐数据。

4

2 回答 2

0

弗雷德,这里有一些你可以尝试的想法。我同意 IML 可能是你要走的路,但你必须使用你手头的东西。

首先,使用数组,您可以使用 PROC TRANSPOSE 或带有 RETAIN 语句的 DATA 步骤修改控制器数据集,以创建两个数组(一个用于时间,另一个用于测量)并在所有数组元素都具有后仅输出最终观察结果被填满。然后,您可以使用带有两个 SET 语句的单独 DATA 步骤(第一个设置 DAQ 数据集,然后是“IF NEQ 1 THEN SET <1 observation POWER dataset name>;"。您需要在这个新数据集中设置数组并再次使用 RETAIN 语句在整个处理过程中保留它们。然后您可以使用 DO 循环来处理数组,其中 DAQ 观察中的时间变量等于或介于时间数组中存储的 POWER 观察的日期之间。这是一种处理信息的相当混乱的方式,并且会导致一个相当大的矩阵,除非您使用一个 KEEP 或 DROP 语句来限制最终输出。但是,此方法将允许您通过多个观察之间的一些外推值来修改 CONTROLLER 观察。

相比之下,我认为我的第二个和第三个建议不会让您在两个值之间进行推断,但无论如何我都会建议它们。

第二个选项,使用 PROC FORMAT 从 CONTROLLER 数据集创建用户定义的格式,其值为时间,格式化值为 POWER 观察值。您需要将数据按时间排序,然后您可以使用 lag 函数定义 START 和 END 值以传递到格式中。创建格式后,您可以使用该格式根据 DAQ 时间变量的格式化值在您的 DAQ 数据集中创建一个新变量。如上所述,使用此过程在值之间进行推断是不可行的。

第三个选项是第二个选项的变体,但不使用格式,您可以使用 DATA Step 组件对象来创建一个哈希对象,您可以遍历该对象以检索您需要的值。我不经常使用这种方法,所以我不会费心去描述它,但你可以在 SAS 网站上找到它的文档。

还有第四个选项可能比其中任何一个都好,但您必须拥有 SAS/ETS 模块才能使用它。您可以使用 EXPAND 过程将 CONTROL 数据集中的 POWER 观测值外推为与 DAQ 数据集时间变量一致的时间频率,然后将此扩展数据集与 DAQ 数据集合并。这种方法可以让您对如何进行外推有相当多的控制,并且相当容易实现,但是再一次,您必须拥有 ETS 模块才能使用该过程。

我没有提供任何示例,因为我的回答过于冗长(本来应该是评论但太长了),但是如果您希望我尝试为所讨论的方法之一提供一些示例代码,请告诉我。祝你好运。

于 2013-02-05T22:26:15.357 回答
0

由于您有 ETS,请参阅此示例以了解 PROC TIMESERIES,尤其是最后的互相关图:

http://support.sas.com/documentation/cdl/en/etsug/63348/HTML/default/viewer.htm#etsug_timeseries_sect044.htm

互相关图将在最佳滞后处达到峰值。

您还可以使用 PROC TIMESERIES 来标准化采样率。

于 2013-02-07T15:58:42.077 回答