作者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
1F:→ tew:也可以用SQL写 不过概念都是一样的 02/08 13:31
2F:推 kurtasd:感谢tew大,等等来试试看! 02/08 14:06