【问题标题】:sas aggregate weekly, monthlysas 每周、每月汇总
【发布时间】:2015-11-18 14:15:30
【问题描述】:

对于下面的数据集(实际是几千行长)我希望 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

【问题讨论】:

    标签: sas aggregate


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      如果您没有 SAS/ETS 许可证,这是另一种方法。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多