全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1298 3
2012-06-19
我现在有如下的表格:

A   2011.6.30  xxx
A   2011.12.31 yyy
B   2011.12.31 zzz
B   2012.6.30 ttt
......

现在想对把原观测补齐为如下的样子:

A 2011.6.30 xxx
A 2011.7.31
A 2011.8.31
...
A 2011.12.31 yyy
...

也就是把两个离散的月份数据中插入连续的月份数据,请问应该怎么办?谢谢!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-6-19 09:05:47
顶一个
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-6-19 10:59:35
data a;
input a $1. date $13. b $8.;
datalines;
A   2011.6.30  xxx
A   2011.12.31 yyy
B   2011.12.31 zzz
B   2012.6.30 ttt
;
run;

data a;
set a;
year=input(substr(date,1,4),4.);
month=input(substr(date,find(date,'.')+1,find(date,'.',find(date,'.')+1)-find(date,'.')),4.);
lag_year=lag(year);
lag_month=lag(month);
lag_a=lag(a);
lag_b=lag(b);
run;

proc sort data=a;
by a year month b;
run;

data a;
set a end=end;
if a=lag_a then do;
                                if year-lag_year=0 then do month1=lag_month to month;
                                                                                        year1=year;
                                                                                        if month1=lag_month then b1=lag_b;
                                                                                        else if month1=month then b1=b;
                                                                                        else b1='';
                                                                                        output;
                                end;
                                else do year1=lag_year to year;
                                                        if year1=lag_year then do month1=lag_month to 12;
                                                                                                                if month1=lag_month then b1=lag_b;
                                                                                                                else b1='';
                                                                                                                output;
                                                                                                        end;
                                                        else if year1=year then do month1=1 to month;
                                                                                                                if month1=month then b1=b;
                                                                                                                else b1='';
                                                                                                                output;
                                                                                                        end;
                                                        else do month1=1 to 12;
                                                        b1='';
                                                        output;
                                                        end;
                                end;
end;
keep a b1 month1 year1;
rename month1=month year1=year b1=b;
run;

data b;
retain a date1 b;
length b $3. date1 $10.;
set a;
date=mdy(input(substr(compress(put(mdy(month,1,year)+31,yymmdd10.),'- '),5,2),2.),1,input(substr(compress(put(mdy(month,1,year)+31,yymmdd10.),'- '),1,4),4.))-1;
date1=compress(substr(compress(put(date,yymmdd10.)),1,4)||'.'||substr(compress(put(date,yymmdd10.)),6,2)||'.'||substr(compress(put(date,yymmdd10.)),9,2));
keep a b date1;
rename date1=date;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-6-25 15:56:05
谢谢你的代码,其中的data步中加do循环,然后生成新的观测再output很有用
其他关于日期的处理你的代码稍显繁琐
其中挑出日期中的年/月/日可以用YEAR/MONTH/DAY函数,找一定间隔的日期可以用INTNX函数
最后还是要感谢你的回复!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群