[程式] SAS如何自動取五分鐘為一筆資料
------------------------------------------------------------------------
[軟體程式類別]:
SAS Eview
[程式問題]:
資料處理
[軟體熟悉度]:
新手
[問題敘述]:
資料型式如下:
月/日/年 時:分:秒 買價
01/04/10 0:04:58 .
01/04/10 0:04:59 1.4316
01/04/10 0:05:05 .
01/04/10 0:05:06 .
01/04/10 0:09:56 .
01/04/10 0:11:04 1.4315
01/04/12 0:10:03 .
以五分鐘為基準,取最靠近每五分鐘的資料,故整理完的資料為:
01/04/10 0:04:59 1.4316
01/04/10 0:09:56 .
01/04/12 0:10:03 .
因為資料需要每一筆每一筆去比較,目前構想為:
if 第i筆資料的分鐘數^=第i-1筆的分鐘數 then;
if 第i筆資料的分鐘數為5或0結尾 then;
if 第i筆的秒數<60-第i筆的秒數 then;
取得這筆資料
end;
end;
end;
[程式範例]:
t1內的資料形式為:
01/04/10 00004 /*0:00:04 手動將帽號替除 不然好像讀不進IML */
01/04/10 00005
01/04/10 00011
01/04/10 00018
以下為程式:
proc iml;
use t1 var _all_;
read all into mat;
rs=nrow(mat);
cs=ncol(mat);
k=0;
mat1=repeat('.',rs,cs);
do i=2 to rs;
if (int(mat[i,2]/100))^=(int(mat[i-1,2]/100)) then
if (int(mat[i,2]/100)-int(mat[i,2]/1000)*10)=0 or
(int(mat[i,2]/100)-int(mat[i,2]/1000)*10)=5 then/*這邊好像不能用or是否有
其他替代方案?*/
if (mat[i,2]-int(mat[i,2]/100)*100)<60-(mat[i-1,2]-int(mat[i-1,2]/100)*100)
then
k=k+1;
mat1[k,1]=mat[i,1];
mat1[k,2]=mat[i,2];
mat1[k,3]=mat[i,3];
mat1[k,4]=mat[i,4];
mat1[k,5]=mat[i,5];
mat1[k,6]=mat[i,6];
mat1[k,6]=mat[i,7];
else
mat1[k,1]=mat[i-1,1];
mat1[k,2]=mat[i-1,2];
mat1[k,3]=mat[i-1,3];
mat1[k,4]=mat[i-1,4];
mat1[k,5]=mat[i-1,5];
mat1[k,6]=mat[i-1,6];
mat1[k,6]=mat[i-1,7];
;;;;
end;
print mat mat1 k rs cs;
quit;
run;
-----------------------------------------------------------------------------
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.34.44.193
→
02/08 05:51, , 1F
02/08 05:51, 1F
→
02/08 05:52, , 2F
02/08 05:52, 2F
推
02/08 07:35, , 3F
02/08 07:35, 3F
→
02/08 07:37, , 4F
02/08 07:37, 4F
→
02/08 07:37, , 5F
02/08 07:37, 5F
→
02/08 07:38, , 6F
02/08 07:38, 6F
→
02/08 10:24, , 7F
02/08 10:24, 7F
→
02/08 10:25, , 8F
02/08 10:25, 8F
※ 編輯: kurtasd 來自: 114.34.44.193 (02/08 10:35)
推
02/08 10:34, , 9F
02/08 10:34, 9F
→
02/08 10:36, , 10F
02/08 10:36, 10F
→
02/08 21:59, , 11F
02/08 21:59, 11F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):