作者tew (咖啡王子)
站內Statistics
標題Re: [程式] SAS如何自動取五分鐘為一筆資料
時間Wed Feb 8 13:28:57 2012
將資料轉成五分鐘一組 300秒
時間格式的資料 是以秒為單位
五分整數 五分餘數
0~299 /300=0 餘0~299
300~599/300=1 餘0~299
proc sort data=yourdata;by 五分整數 五分餘數;
run;
data a;
set yourdata;by 五分整數;
if last.五分整數;
run;
以上收工
不用花時間去寫矩陣
※ 引述《kurtasd (阿炫)》之銘言:
: ------------------------------------------------------------------------
: [軟體程式類別]:
: 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: 42.72.12.224
→ tew:也可以用SQL寫 不過概念都是一樣的 02/08 13:31
推 kurtasd:感謝tew大,等等來試試看! 02/08 14:06