sas每周汇总,每月汇总

时间:2015-11-18 14:15:30

标签: sas aggregate

对于下面的数据集(实际一个是几千行)我希望SAS每天汇总收入(每台机器每天收入很多),每周,每月(周开始是星期一,月初是01)在任何给定的一年)由机器。这是一个直接的代码吗?任何帮助表示赞赏。

MachineNo  Date      income
1         01Jan2012  1500 
1         02Jan2012  2000
1         27Aug2012  300 
2         02Jan2012  1200
2         15Jun2012  50
3         03Mar2012  1000
4         08Apr2012  500

2 个答案:

答案 0 :(得分:1)

proc expandproc 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;

答案 1 :(得分:1)

如果您没有SAS / ETS许可证,则另一种方式。

对于月度数据,您可以在proc表示输出中格式化日期。 我想周末。从星期一开始,但它可能不是你想要的格式,所以如果你想使用这种方法,你需要先创建一个新的变量。

proc means data=have nway noprint;
class machineno date;
format date monyy7.;
var income;
output out=want sum(income)=income;
run;