proc expand 和proc timeseries 是用于积累和聚合到不同频率系列的优秀工具。您可以将两者与按组处理相结合,以转换为您需要的任何时间段。
第 1 步:按机器编号和日期排序
proc sort data=want;
by MachineNo Date;
run;
第 2 步:查找系列的最小/最大结束日期以进行日期对齐
format=date9. 语句很重要。无论出于何种原因,某些 SAS/ETS 和 HPF 过程都需要某些参数的日期文字。
proc sql noprint;
select min(date) format=date9.,
max(date) format=date9.
into :min_date,
:max_date
from have;
quit;
第 3 步:按开始/结束日期对齐每个 MachineNo,并按 MachineNo 累积天数
以下代码将使您对齐每日累积,删除每台机器的重复天数,并将任何缺失天数的 Income 设置为 0。此步骤还将保证您的系列具有每个组的相等时间间隔,允许您在不违反等间距假设的情况下运行分层时间序列分析。
proc timeseries data=have
out=want_day;
by MachineNo;
id date interval=day
align=both
start="&min_date"d
end="&max_date"d;
var income / accumulate=total setmiss=0;
run;
第 4 步:按 1 天、每月汇总对齐的每日到每周
SAS 时间间隔可以相乘和移位。由于标准工作日从星期日开始,我们希望移动 1 天以使其从星期一开始。
Standard Week
2 3 4 5 6 7 1
Mon Tue Wed Thu Fri Sat Sun
Shifted
1 2 3 4 5 6 7
Mon Tue Wed Thu Fri Sat Sun
间隔遵循以下格式:
TimeInterval<Multiplier>.<Shift>
标准换档间隔为 1。出于所有意图和目的,将 1 视为 0:1 表示未换档。 2 表示它移动了 1 个句点。因此,对于从星期一开始的一周,我们希望使用间隔 Week.2。
proc expand data=want_day
out=want_week
from=day
to=week.2;
id date;
convert income / method=aggregate observed=total;
run;
第 5 步:将周转换为月
proc expand data=want_week
out=want_month
from=week.2
to=month;
id date;
convert income / method=aggregate observed=total;
run;