作者tew (咖啡王子)
站内Statistics
标题Re: [程式] SAS 取上一「季」资料
时间Sat Aug 21 00:04:14 2010
这个问题其实不难
重要的是对时间做一个转换
不管你是用时间格式或是数字格式 都用一样的技巧
data a;
set a;
m=mod(yrmon)-1;
/*月份变为 0~11月*/
q=int(m/4)+1;
/*季=m除4 再取整数 所以 0~3变成第一季*/
q=int(yrmon/100)*100+q;
run;
proc sort data=a out=time(keep=q) nodupkey;by q;
run;
proc sort data=a;by q;
run;
data time;
set time;
t=_n_;
run;
data a;
merge a time;by q;
run;
接下来 在简单合并就可以处理跨季问题
因为 你的季度 已经重新油1编到m
2一定是1的下一季
就不用担心所谓的跨年度问题
当兵放假後 看到有趣的问题也是挺好玩的
※ 引述《lsshno1 (朝右边锋迈进)》之铭言:
: 如果按照Kinbee前辈叙述的话, 下面方法请您参考
: /*data a*/
: data a;
: input idno yrmon price;
: cards;
: 1101 200104 8.2
: 3018 200201 5.8
: ;
: run;
: /*data b*/
: data b;
: input idno yrmon vol;
: cards;
: 1101 200103 23
: 3108 200103 16
: 1101 200106 20
: 3108 200106 18
: 1101 200109 22
: 3108 200109 19
: 1101 200112 25
: 3108 200112 15
: 1101 200203 28
: 3108 200203 14
: ;
: run;
: /*排序及合并 (我没有用date format 不过是一样的)*/
: proc sort data=a;
: by yrmon;
: run;
: proc sort data=b;
: by yrmon;
: run;
: data c;
: set a b;
: by yrmon;
: run;
: proc print data=c;
: run;
: /*新的资料 c*/
: data c;
: set c;
: /*制造出lag一期的资料*/
: vol_lag=lag(vol);
: /*如果vol为missing的话, 则用lag一期的资料取代*/
: if vol=. then vol=vol_lag;
: drop vol_lag;
: run;
: 结果(没有drop vol_lag时)
: idno yrmon price vol vol_lag
: 1 1101 200103 . 23 .
: 2 3108 200103 . 16 23
: 3 1101 200104 8.2 16 16
: 4 1101 200106 . 20 16
: 5 3108 200106 . 18 20
: 6 1101 200109 . 22 18
: 7 3108 200109 . 19 22
: 8 1101 200112 . 25 19
: 9 3108 200112 . 15 25
: 10 3018 200201 5.8 15 15
: 11 1101 200203 . 28 15
: 12 3108 200203 . 14 28
: 这应该可以, 不过资料的开头要注意一下.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.228.153
1F:→ liton:问题是跨到另一个年度的时候怎处理? 08/21 02:07
200101~200103--->200101--->1
200104~200106--->200102--->2
200107~200109--->200103--->3
200110~200112--->200104--->4
200201~200203--->200201--->5
200204~200206--->200202--->6
基本上财务资料这样处理就可以了
我的程式处理就是这样做
liton大不用担心
这几年 我整理财务资料 都用这招
保证不会出错
如果担心个别公司的财务年度怕有缺
可以这样写
data time;
do y=1963 to 2010;
do qtr=1 to 4;
q=y*100+qtr;
output;
end;
end;
run;
data time;
set time;
t=_n_;
run;
或者直接利用大盘的时间资料做编码
之後再将这个依照季度编好的 t变项和其他资料合并
以上技巧 我都写在目前正在做最後修正的书中
以後如果出版(说不定变成自己的教学讲义) 请大家不吝指教
因为目前使用的不是自己的电脑
没办法把程式写得很完整
所以仅作时间年度的变项转换做提示
可能没有把这个程式的主要功能写清楚
不过 这样处理以後 dif(t)=1 表示 这个季资料跟前一季差一季
先求出落後期资料後
再去跟月资料做合并
是我个人处理资料的顺序
大家可以参考一下 这样的步骤
※ 编辑: tew 来自: 61.216.249.77 (08/21 08:35)
2F:→ liton:这....SAS有算计的函数吧....还需要自己另外做个回圈? 08/21 17:09
3F:→ wlsherica:感谢您的分享~ 08/23 20:51