对于下面的数据集(实际一个是几千行)我希望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
答案 0 :(得分:1)
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;
答案 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;