全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3418 7
2010-03-05
比如 需要知道 2010年2月3号 前,后10个交易日的数据(日期是不连续的),就是前后10个obs, 怎么从一堆数据里面把这21天数据提出来啊?

如果生成一个变量叫 edate,把2月3号的值设置为0,那么2月2号应该是-1,2月1号是-2,1月29号是-3,诸如此类,一直算到-10;2月4号为1,一直推到10。 数据里面都是交易日的数据。

本来想用count ,结果完全不知道怎么写程序。

希望最后能出来的结果是这样的, 就是要把edate 那列做出来。我的能力就只能把0 那个做出来,倒着数和正着数都完全迷茫……

OBS  DATE   EDATE  RET
1                      -10
2                       -9
3                       -8
……
11                      0
……
21                    10


谢谢在此活动的牛人们!!!
二维码

扫码加我 拉你入群

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

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

全部回复
2010-3-5 02:58:04
data test;
set test1;
where (2010年2月3号)d -10=<data<=(2010年2月3号)d +10;
run;
二维码

扫码加我 拉你入群

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

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

2010-3-5 03:05:24
谢谢楼上的
不过,这个数据里面只有交易日,就是说日期不是连续的,没有周6和周日和法定假日
二维码

扫码加我 拉你入群

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

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

2010-3-5 08:29:27
sausau 发表于 2010-3-5 02:27
比如 需要知道 2010年2月3号 前,后10个交易日的数据(日期是不连续的),就是前后10个obs, 怎么从一堆数据里面把这21天数据提出来啊?

如果生成一个变量叫 edate,把2月3号的值设置为0,那么2月2号应该是-1,2月1号是-2,1月29号是-3,诸如此类,一直算到-10;2月4号为1,一直推到10。 数据里面都是交易日的数据。

本来想用count ,结果完全不知道怎么写程序。

希望最后能出来的结果是这样的, 就是要把edate 那列做出来。我的能力就只能把0 那个做出来,倒着数和正着数都完全迷茫……

OBS  DATE   EDATE  RET
1                      -10
2                       -9
3                       -8
……
11                      0
……
21                    10


谢谢在此活动的牛人们!!!
There is a point access option on data set you may use in this case.

Here is an example.

data tmp;
   do date='23jan2010'd to '23mar2010'd;
       x+1;
       if weekday(date) not in (6,7) then output;
    end;
run;

proc print data=tmp;
format date date9.;
run;

data tmp2;
   set tmp;
   k+1;
   if date='01MAR2010'd then do;
     do n=-10  to 10;
        point=max(1,n+k);
       set tmp point=point;
       output;
     end;
    end;
    run;

proc print;
format date date9.;
run;
二维码

扫码加我 拉你入群

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

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

2010-3-5 08:44:36
sausau 发表于 2010-3-5 02:27
比如 需要知道 2010年2月3号 前,后10个交易日的数据(日期是不连续的),就是前后10个obs, 怎么从一堆数据里面把这21天数据提出来啊?

如果生成一个变量叫 edate,把2月3号的值设置为0,那么2月2号应该是-1,2月1号是-2,1月29号是-3,诸如此类,一直算到-10;2月4号为1,一直推到10。 数据里面都是交易日的数据。

本来想用count ,结果完全不知道怎么写程序。

希望最后能出来的结果是这样的, 就是要把edate 那列做出来。我的能力就只能把0 那个做出来,倒着数和正着数都完全迷茫……

OBS  DATE   EDATE  RET
1                      -10
2                       -9
3                       -8
……
11                      0
……
21                    10


谢谢在此活动的牛人们!!!
This one is more efficient. If your data contain weekend obs, you can modify it on the condition of week days.

data tmp2;
   set tmp;
   week2=intnx('week', '01MAR2010'd,2)+1;
   week_2=intnx('week', '01MAR2010'd,-2)+1;
   if  week_2<=date<=week2 then output;
   drop week:;
    run;
二维码

扫码加我 拉你入群

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

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

2010-3-5 09:25:36
学习了 解决同一个问题有很多方法 重要的是选择最有效的 谢谢
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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