作者chien533 (谣指部总司令)
标题Re: [程式] SAS如何配对每五分钟资料
时间Sun Apr 5 03:37:27 2015
这个资料整理的难度是要纵向去抓最靠近的五分钟的那个值然後配对上来
因此程式写作的思路是
step1. 抓出每个时间点超过五分钟後的时间点当candidate
step2. 从这些candidate中抓出第一笔时间点
step3. 把抓出的第一笔时间点相对应的价格也抓出来
step4. 配对抓出来的价格和原本的价格
因此我先把范例延伸成十个时间点,这样比较好写范例:
data temp;
input time hhmmss. price;
cards;
090110 15
090220 16
090530 17
090630 18
090720 19
090840 20
090950 21
091010 22
091120 23
091230 24
;
用data step无法直接处理,所以我用proc iml:
proc iml;
/*把资料读进一个x的矩阵内*/
use temp;
read all into x;
/*建立一个10X10的空矩阵*/
y = J(10, 10, .);
/*算出每一个时间点跟其他时间点的秒数差距,并用横的方式排列*/
/*算好後把所有小於300秒的数值都设定为missing*/
do i = 1 to 10;
do j = 1 to 10;
y[j, i] = x[i,1] - x[j,1];
if y[j, i] <= 300 then y[j, i] = .;
end;
end;
/*算每一个时间点有多少个missing,而missing+1的结果就是最靠近
五分钟後的那个时间点位置。把那个位置存在idx矩阵内*/
m = missing(y);
idx = m[,+]+1;
/*整理idx矩阵,让没有五分钟後时间点的位置都变成missing data*/
do i = 1 to 10;
if idx[i] > 10 then idx[i] = .;
end;
/*开一个都是0的10X10矩阵,然後让第i列的第idx[i]行变成1*/
/*因此这个矩阵就可以用来去抓相对应的price值*/
z = J(10,10,0);
do i = 1 to 10;
z[idx[i],i] = 1;
end;
/*把五分钟後最靠近的那个price值抓出来存在一个price2的向量里面
(注意他是横的)*/
price2 = t(x[,2])*z;
/*把price2转成直的後跟原本的存放资料的x矩阵合并*/
match = x||t(price2);
print match;
/*把配对好的资料输出成SAS档....请自己写*/
quit;
结果呈现:
match
32470 15 18
32540 16 20
32730 17 23
32790 18 24
32840 19 24
32920 20 0
32990 21 0
33010 22 0
33080 23 0
33150 24 0
注意,没有配对值的数据都是0,如有必要请自行转换成missing
※ 引述《TheDuke (Duke)》之铭言:
: 入门程度
: 低(1~3个月)
: [问题叙述]:
: 目前在处理日内的资料,需要把每个时点的资料配对上最靠近的5分钟後的资料
: 像是
: 时间 价格 五分後价格
: 090110 15 17
: 090220 16 19
: 090530 17 19
: 090630 18
: 090720 19
: [程式范例]:
: 目前是参照板上之前的文章 将时间转成秒数除以300後 用INT 跟MOD 还有first.去筛选资料
: 但是是完全无法配对
: data aa; set aa; SEC_COUNT = (hr-9)*3600+min*60+sec;
: INT_5 = int(SEC_COUNT/300) ;
: mod_5 = MOD(SEC_COUNT,300) ; run;
: data aa;set aa; if first.INT_5;run;
: 跑出来的资料虽然是每五分钟的资料,但我需要的是每笔资料每个时间点都要有对应的
: 五分钟後的资料,请问各位高手我应该怎麽做?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 139.52.242.104
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Statistics/M.1428176250.A.C56.html
1F:推 TheDuke: 我明白了~谢谢~ 04/05 11:29