SAS:如何从较低频率的时间序列转换为较高频率的时间序列

时间:2014-07-19 16:18:32

标签: sas time-series

例如:

date       value
1/1/1990     1
1/1/1991     2

我想要的结果是

date       value
1/1/1990     1
2/1/1990     1
3/1/1990     1
...
1/1/1991     2
2/1/1991     2
3/1/1991     2
...

我调查了PROC EXPAND程序,但它没有按照我的意愿行事。不知道如何以有效的方式做这么简单的事情。

由于

1 个答案:

答案 0 :(得分:1)

您应该可以使用PROC EXPAND执行此操作,但在数据步骤中它也是微不足道的。

data want;
  merge have have(firstobs=2 rename=(date=last_date) keep=date);
  if not missing(last_date) then do date=date to (last_date-1);
    output;
  end;
  keep date value;
run;

这是一个前瞻性合并,您可以将数据集合并到自身,并从顶部移除一行。

它不适用于最后一行,除非你a)添加了额外的最后一行,或b)写了一条规则专门适用于最后一行。

如果你总是把这一行从一年的第一年转换到一年的最后一年,那么它也可能比这更容易写。

data want;
 set have;
 do date = date to intnx('Year',date,1,'s');
  output;
 end;
run;

要使用PROC EXPAND执行此操作,您可以执行此操作:

proc expand data=have out=want from=year to=day method=aggregate;
 id date;
run;

同样,它需要一个'最终'添加行以执行您想要的操作 - 它不会超过最后观察到的行;但如果需要的话,这似乎并不困难。如果你有固定的时间间隔,我会在这里使用第二种方法;如果你的时间间隔没有固定,我会使用其他方法之一(如果需要,可以添加最终观察)。