SAS中文论坛

标题: 请教;如何筛选出每个月最后一天 [打印本页]

作者: shiyiming    时间: 2008-11-4 21:41
标题: 请教;如何筛选出每个月最后一天
例如有以下数据集
rq
1997-10-6
1997-10-7
1997-10-8
1997-10-9
1997-10-10
1997-10-13
1997-10-14
1997-10-15
1997-10-16
1997-10-17
1997-10-20
1997-10-21
1997-10-22
1997-10-23
1997-10-24
1997-10-27
1997-10-28
1997-10-29
1997-10-30
1997-10-31
1997-11-3
1997-11-4
1997-11-5
1997-11-6
1997-11-7
1997-11-10
1997-11-11
1997-11-12
1997-11-13
1997-11-14
1997-11-17
1997-11-18
1997-11-19
1997-11-20
1997-11-21
1997-11-24
1997-11-25
1997-11-26
1997-11-27
1997-11-28
1997-12-1
1997-12-2
1997-12-3
1997-12-4
1997-12-5
1997-12-8
1997-12-9
1997-12-10
1997-12-11
1997-12-12
1997-12-15
1997-12-16
1997-12-17
1997-12-18
1997-12-19
1997-12-22
1997-12-23
1997-12-24
1997-12-25
1997-12-26
1997-12-29
1997-12-30
1997-12-31
1998-1-5
1998-1-6
1998-1-7
1998-1-8
1998-1-9
1998-1-12
1998-1-13
1998-1-14
1998-1-15
1998-1-16
1998-1-19
1998-1-20
1998-1-21
1998-1-22
1998-1-23
1998-2-9
1998-2-10
1998-2-11
1998-2-12
1998-2-13
1998-2-16
1998-2-17
1998-2-18
1998-2-19
1998-2-20
1998-2-23
1998-2-24
1998-2-25
1998-2-26
1998-2-27
1998-3-2
1998-3-3
1998-3-4
1998-3-5
1998-3-6
1998-3-9
1998-3-10
1998-3-11
1998-3-12
1998-3-13
1998-3-31
rq表示日期,
现在想筛选出每个月的最后一天,请问该如何编程?谢谢
也就是得到以下数据集
1997-10-31
1997-11-28
1997-12-31
1998-1-23
1998-2-27
1998-3-31
作者: shiyiming    时间: 2008-11-4 22:07
标题: Re: 请教;如何筛选出每个月最后一天
方法n多,自己好好想想吧,。
作者: shiyiming    时间: 2008-11-5 15:25
标题: Re: 请教;如何筛选出每个月最后一天
方法之一:
假如你的数据集名称a1:
data a2;
    set a1;
    year=year(cdate);
    month=month(cdate);
run;
proc sort data=a2;
    by year month cdate;
run;
data a3;
    set a2;
    by year month cdate;
    if last.month then output;
run;
作者: shiyiming    时间: 2008-11-5 21:41
标题: Re: 请教;如何筛选出每个月最后一天
方法一显然不是最优方案
比较繁琐
作者: shiyiming    时间: 2008-11-6 16:27
标题: Re: 请教;如何筛选出每个月最后一天
[code:1d5gyr4p]data a2;
     set a1;
         rt=input(rq,yymmdd10.);
         yr=put(rt,yymm7.);
run;

proc sql;
     create table a3 as
         select max(rt) format=yymmdd10. as last
         from a2
         group by yr;
quit;[/code:1d5gyr4p]
作者: shiyiming    时间: 2008-11-6 19:15
标题: Re: 请教;如何筛选出每个月最后一天
咳。。。。。。。。。。。
作者: shiyiming    时间: 2008-11-6 20:23
标题: Re: 请教;如何筛选出每个月最后一天
弱弱的问byes大师,是否用INTNX的效果可能会更好些? <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2008-11-6 22:12
标题: Re: 请教;如何筛选出每个月最后一天
版主太谦虚了,还弱弱,应该叫强强。
intnx的话个人觉得可以,不过这样的话正好做每个月的最后一日。
但是如果数据集中每月最后一日不是月底,而是不固定的,那就用intnx可能不是很方便了。
个人观点,进攻参考
作者: shiyiming    时间: 2008-11-6 23:15
标题: Re: 请教;如何筛选出每个月最后一天
根据楼上的思路,修改后的代码:
data a1 ;
input rq  yymmdd10. ;
datalines ;
1997-10-6
1997-10-7
1997-10-8
1997-10-9
1997-10-10
1997-10-13
1997-10-14
1997-10-15
1997-10-16
1997-10-17
1997-10-20
1997-10-21
1997-10-22
1997-10-23
1997-10-24
1997-10-27
1997-10-28
1997-10-29
1997-10-30
1997-10-31
1997-11-3
1997-11-4
1997-11-5
1997-11-6
1997-11-7
1997-11-10
1997-11-11
1997-11-12
1997-11-13
1997-11-14
1997-11-17
1997-11-18
1997-11-19
1997-11-20
1997-11-21
1997-11-24
1997-11-25
1997-11-26
1997-11-27
1997-11-28
1997-12-1
1997-12-2
1997-12-3
1997-12-4
1997-12-5
1997-12-8
1997-12-9
1997-12-10
1997-12-11
1997-12-12
1997-12-15
1997-12-16
1997-12-17
1997-12-18
1997-12-19
1997-12-22
1997-12-23
1997-12-24
1997-12-25
1997-12-26
1997-12-29
1997-12-30
1997-12-31
1998-1-5
1998-1-6
1998-1-7
1998-1-8
1998-1-9
1998-1-12
1998-1-13
1998-1-14
1998-1-15
1998-1-16
1998-1-19
1998-1-20
1998-1-21
1998-1-22
1998-1-23
1998-2-9
1998-2-10
1998-2-11
1998-2-12
1998-2-13
1998-2-16
1998-2-17
1998-2-18
1998-2-19
1998-2-20
1998-2-23
1998-2-24
1998-2-25
1998-2-26
1998-2-27
1998-3-2
1998-3-3
1998-3-4
1998-3-5
1998-3-6
1998-3-9
1998-3-10
1998-3-11
1998-3-12
1998-3-13
1998-3-31
;


data a2;
set a1;
year_data = year(rq);
month_data = month(rq);
run;

proc sql;
    create table a3 as
    select max(rq) as rq
        from a2
    group by year_data, month_data ;
quit;
proc print data = a3 ;
format rq yymmdd10. ;
run;
作者: shiyiming    时间: 2008-11-7 00:44
标题: Re: 请教;如何筛选出每个月最后一天
if it's already sorted by rq, then
[code:398rkign]
data b(keep=rq);
    set a1 (keep=rq rename=(rq=cur_rq)) end=eof;
    rq = lag(cur_rq);
    if _n_&gt;1 then
         if intnx('month', rq, 1, 'beginning') le cur_rq then
             output;
    if eof then do;
         rq = cur_rq;
         output;
    end;
run;
[/code:398rkign]
it just has as many steps as LSD did.
作者: shiyiming    时间: 2008-11-7 10:58
标题: Re: 请教;如何筛选出每个月最后一天
[code:cexqxxjd]proc sort data=a1;
by descending rq;/*选第一天就不用sort了*/
run;
data a2;
set a1;
if dif(month(rq)) ne 0;
run;[/code:cexqxxjd]

不知道是不是简单了点儿 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2008-11-7 18:50
标题: Re: 请教;如何筛选出每个月最后一天
sql实现的话,就一个sql就行了,不需要前面的data步
作者: shiyiming    时间: 2008-11-7 20:21
标题: Re: 请教;如何筛选出每个月最后一天
i see, the CALCULATED keyword
[code:1pblpcok]
proc sql;
select rq from(
    select max(rq) as rq format=yymmdd10&#46;, month(rq) as month, year(rq) as year
         from a
         group by CALCULATED year, CALCULATED month
    );
quit;
[/code:1pblpcok]
or
[code:1pblpcok]
proc report data=a nowd out=b(keep=rq);
        column rq rq=month;
        define rq/max format=yymmdd10&#46;;
        define month/group format=yymmn6&#46;;
run;
[/code:1pblpcok]
作者: shiyiming    时间: 2008-11-7 22:29
标题: Re: 请教;如何筛选出每个月最后一天
兄弟,真是强悍啊。
继续
sql用一个select就可以了,不用嵌套select
作者: shiyiming    时间: 2008-11-8 05:37
标题: Re: 请教;如何筛选出每个月最后一天
真的不知道怎么办了,byes别折磨人了。料就这么多,要不为什么上面的怎么搞都没事,咱家只是拉了拉幼齿就栽了呢?
[code:1bf4b3y9]
proc means data=a noprint max;
class rq;
var rq;
format rq yymmS7&#46;;
ways 1;
output out=xxx(drop=_type_ _freq_) max=max_rq;
run;
[/code:1bf4b3y9]
or
[code:1bf4b3y9]
proc univariate data=a noprint;
class rq;
var rq;
format rq yymms7&#46;;
output out=xxx max=max_rq;
run;
[/code:1bf4b3y9]
or if it's sorted then
[code:1bf4b3y9]
data xxx;
set a;
by rq groupformat;
if last&#46;rq;
format rq yymms7&#46;;
run;
[/code:1bf4b3y9]
作者: shiyiming    时间: 2008-11-8 10:18
标题: Re: 请教;如何筛选出每个月最后一天
上面最有一个data步正是我想要的。牛人。
五体投地
作者: shiyiming    时间: 2008-11-12 06:48
标题: Re: 请教;如何筛选出每个月最后一天
byes过奖了!跟您的指导是分不开的。

最近咱家名气实在是太大了点。不就说了几句真话嘛!我这人最大的缺点就是敢讲真话,用你们喝过洋墨水的人的话说就是“too outspoken”(别误会,我是正宗的工农兵大学生,这词儿是前几年听江总说的)。咱们共产党员说真话就要做好被误解的准备,尤其是网上一帮别有用心的人总是喜欢煽动不明真相的群众,给我们机关造成了不小的压力。这不,领导上暂时解除了我的职务,安排咱学SAS来了!




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2