请教;如何筛选出每个月最后一天
例如有以下数据集
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
解答:
weimomei »
方法之一:
假如你的数据集名称a1:
<br />
data a2;<br />
set a1;<br />
year=year(cdate);<br />
month=month(cdate);<br />
run;<br />
proc sort data=a2;<br />
by year month cdate;<br />
run;<br />
data a3;<br />
set a2;<br />
by year month cdate;<br />
if last.month then output;<br />
run; <br />
byes »
方法一显然不是最优方案
比较繁琐
<br />
horse1 » <br />
<br />
data a2;<br />
set a1;<br />
rt=input(rq,yymmdd10.);<br />
yr=put(rt,yymm7.);<br />
run;<br />
<br />
proc sql;<br />
create table a3 as<br />
select max(rt) format=yymmdd10. as last<br />
from a2<br />
group by yr;<br />
quit;<br />
byes »
咳。。。。。。。。。。。
林嘉祥 »
<br />
data b(keep=rq);<br />
set a1 (keep=rq rename=(rq=cur_rq)) end=eof;<br />
rq = lag(cur_rq);<br />
if _n_>1 then<br />
if intnx('month', rq, 1, 'beginning') le cur_rq then<br />
output;<br />
if eof then do;<br />
rq = cur_rq;<br />
output;<br />
end;<br />
run;<br />
<br />
it just has as many steps as LSD did.
superkuhasu »
<br />
proc sort data=a1;<br />
by descending rq;/*选第一天就不用sort了*/<br />
run;<br />
data a2;<br />
set a1;<br />
if dif(month(rq)) ne 0;<br />
run;<br />
林嘉祥 »
<br />
proc sql;<br />
select rq from(<br />
select max(rq) as rq format=yymmdd10., month(rq) as month, year(rq) as year<br />
from a<br />
group by CALCULATED year, CALCULATED month<br />
);<br />
quit;<br />
<br />
or
<br />
proc report data=a nowd out=b(keep=rq);<br />
column rq rq=month;<br />
define rq/max format=yymmdd10.;<br />
define month/group format=yymmn6.;<br />
run;<br />
byes »
兄弟,真是强悍啊。
继续
sql用一个select就可以了,不用嵌套select
林嘉祥 »
真的不知道怎么办了,byes别折磨人了。料就这么多,要不为什么上面的怎么搞都没事,咱家只是拉了拉幼齿就栽了呢?
<br />
proc means data=a noprint max;<br />
class rq;<br />
var rq;<br />
format rq yymmS7.;<br />
ways 1;<br />
output out=xxx(drop=_type_ _freq_) max=max_rq;<br />
run;<br />
<br />
or
<br />
proc univariate data=a noprint;<br />
class rq;<br />
var rq;<br />
format rq yymms7.;<br />
output out=xxx max=max_rq;<br />
run;<br />
or if it's sorted then
<br />
data xxx;<br />
set a;<br />
by rq groupformat;<br />
if last.rq;<br />
format rq yymms7.;<br />
run;<br />
byes »
上面最有一个data步正是我想要的。牛人。
五体投地
林嘉祥 »
byes过奖了!跟您的指导是分不开的。
最近咱家名气实在是太大了点。不就说了几句真话嘛!我这人最大的缺点就是敢讲真话,用你们喝过洋墨水的人的话说就是“too outspoken”(别误会,我是正宗的工农兵大学生,这词儿是前几年听江总说的)。咱们共产党员说真话就要做好被误解的准备,尤其是网上一帮别有用心的人总是喜欢煽动不明真相的群众,给我们机关造成了不小的压力。这不,领导上暂时解除了我的职务,安排咱学SAS来了!