看板 Statistics 關於我們 聯絡資訊
將資料轉成五分鐘一組 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