2015-11-18 367 views
0

對於下面的數據集(實際一個是幾千行長),我希望SAS每天累計收入(每臺機器每天多個收入行),每週,每月(周的開始是星期一,機器每個月的開始時間是01年)。有沒有一個簡單的代碼呢?任何幫助表示讚賞。sas每週總計,每月

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

回答

1

proc expandproc timeseries是積累和聚集,以一系列不同頻率的優秀工具。您可以將它們與分組處理結合以轉換爲您需要的任何時間段。

第1步:按MachineNo和日期

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; 

第三步:將通過開始/結束日期每個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

如果你不具備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;