Date 最近5天可用的SAS返回数据
我有一份每天上午9点、上午10点、上午11点等的日内价格清单,其格式为数字格式,如15011、15012等 我只想保留“t”日期后最后5天和接下来5天的观察结果,并删除所有其他内容。 有办法做到这一点吗 我试着用 如果日期<&t-5或日期>&t+5,则删除; 然而,由于有周末/假期,我没有得到我想要的所有观察结果Date 最近5天可用的SAS返回数据,date,sas,Date,Sas,我有一份每天上午9点、上午10点、上午11点等的日内价格清单,其格式为数字格式,如15011、15012等 我只想保留“t”日期后最后5天和接下来5天的观察结果,并删除所有其他内容。 有办法做到这一点吗 我试着用 如果日期&t+5,则删除; 然而,由于有周末/假期,我没有得到我想要的所有观察结果 提前多谢 信息不多,但这里有一个可能的解决方案: /* Invent some data */ data have; do date=15001 to 15020; do time='09
提前多谢 信息不多,但这里有一个可能的解决方案:
/* Invent some data */
data have;
do date=15001 to 15020;
do time='09:00't,'10:00't,'11:00't;
price = ranuni(0) * 10;
output;
end;
end;
run;
/* Your macro variable identifying the target "date" */
%let t=15011;
/* Subset for current and following datae*/
proc sort data=have out=temp(where=(date >= &t));
by date;
run;
/* Process to keep only current and following five days */
data current_and_next5;
set temp;
by date;
if first.date then keep_days + 1; /* Set counter for each day */
if keep_days <= 6; /* Days to keep (target and next five) */
drop keep_days; /* Drop this utility variable */
run;
/* Subset for previous and sort by date descending */
proc sort data=have out=temp(where=(date < &t));
by descending date;
run;
/* Process to keep only five previous days */
data prev5;
set temp;
by descending date;
if first.date then keep_days + 1; /* Set counter for each day */
if keep_days <= 5; /* Number of days to keep */
drop keep_days; /* Drop this utility variable */
run;
/* Concatenate together and re-sort by date */
data want;
set current_and_next5
prev5;
run;
proc sort data=want;
by date;
run;
当然,此解决方案建议您的起始数据包含所有有效交易日的观察值,并返回所有数据,而不进行日期运算。更好的解决方案是创建一个包含所有有效日期的交易日历数据集。你可以很容易地应付周末,但假期和其他非交易日是非常具体的网站;因此,使用日历几乎总是首选
更新:乔的评论让我更仔细地重新阅读了这个问题。这将返回总共11天的数据;前五天、后五天和目标日期。不过,更好的解决方案还是使用日历参考表。试试这个
/* Get distinct dates before and after &T */
proc freq data=mydata noprint ;
table Date /out=before (where=(Date < &T)) ;
table Date /out=after (where=(Date > &T)) ;
run ;
/* Take 5 days before and after */
proc sql outobs=5 ;
create table before2 as
select Date
from before
order by Date descending ;
create table after2 as
select Date
from after
order by Date ;
quit ;
/* Subset to 5 available days before & after */
proc sql ;
create table final as
select *
from mydata
where Date >= (select min(date) from before2)
and Date <= (select max(date) from after2)
order by Date ;
quit ;
请发布一些代码来重现您的问题。不幸的是,这错过了“最后5天”。我想,您可以通过反向排序来选择这些日期。我们是否可以使用proc sql来根据某些条件从表中选择日期,例如,如果price=XX,则选择该日期确定目标日期的宏变量*/%let t=15011;