全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5249 18
2013-03-04

各位前辈好,
小弟的问题简单举例如下:

日期         成交时间(时/分)   价格 数量

20130101   0900                   500    2
20130101   0902                   502    1
20130101   0905                   498    3
20130101   0907                   499    1


我希望的是能够把时间补齐,然后缺的那一笔数据是同上一笔资料,
也就是希望的结果如下:

@日期和成交时间是数字!不要变成时间的格式。
日期(date)   成交时间(时/分)(dealtime)  价格(P)  数量(Q)

20130101   0900                                   500        2
20130101   0901                                   500        2
20130101   0902                                   502       1
20130101   0903                                   502        1
20130101   0904                                   502        1

20130101   0905                                   498        3
20130101   0906                                   498        3
20130101   0907                                   499        1


红字表示我补上缺的时间之后,其余的日期/价格/数量都是用前面一笔资料来补。


2013/3/6 更新,附上一部分的資料(SAS上面截图)

擷取.JPG


从图中,举例:20050602 3笔数据,成交时间(deal)分别有0904(9时04分) 0936 1008。09050935缺的时间,皆补上0904的数据。
09371007缺的时间,皆补上0936的数据。
1008之后,1009-1345缺的时间,皆补上1008的数据。


附註:分钟是00-59最后时刻是1345(1345)而不是2359,开始时刻不一定,需视第一笔数据时间为主往后补。




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-3-5 07:56:57
data test;
input date yymmdd8. @12 T $4. price quantity;
  hour   = input(substr(T,1,2), 2.);
  minute = input(substr(T, 3,2), 2.);
  Time   = hms(hour,minute,0);
  format Time hhmm5. date date9.;
  drop T hour minute;
datalines;
20130101   0900  500    2
20130101   0902  502    1
20130101   0905  498    3
20130101   0907  499    1
20130101   0908  501    4
20130101   0909  502    5
; run;


proc sort data=test;     by date time;  run;

data test1;
    set test end=last;
          Time_Lag  = lag(Time);
           Price_Lag = lag(Price);
     Quantity_Lag = lag(quantity);
             TimeDiff = intck('minute', time_lag, time);
   if TimeDiff ^> 1 then output;
   if TimeDiff  > 1 then do;
    do i = 1 to TimeDiff;
           Time = intnx('minute', time_lag, i);
          Price = Price_Lag;
        uantity = Quantity_lag;
      output;
   end;
     end;
  by date;
   drop Price_lag Quantity_lag Time_lag TimeDiff i;
run;


data test_result;
    merge test1 test;
by date time;
run;
proc print data=test_result; run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-3-5 07:58:13
发错了,怎么删掉一贴。
data test;
input date yymmdd8. @12 T $4. price quantity;
  hour   = input(substr(T,1,2), 2.);
  minute = input(substr(T, 3,2), 2.);
  Time   = hms(hour,minute,0);
  format Time hhmm5. date date9.;
  drop T hour minute;
datalines;
20130101   0900  500    2
20130101   0902  502    1
20130101   0905  498    3
20130101   0907  499    1
20130101   0908  501    4
20130101   0909  502    5
; run;
proc sort data=test;     
    by date time;  
run;

data test1;
    set test end=last;
           Time_Lag  = lag(Time);
           Price_Lag = lag(Price);
        Quantity_Lag = lag(quantity);
            TimeDiff = intck('minute', time_lag, time);
   if TimeDiff ^> 1 then output;
   if TimeDiff  > 1 then do;
           do i = 1 to TimeDiff;
                Time = intnx('minute', time_lag, i);
               Price = Price_Lag;
            Quantity = Quantity_lag;
             output;
          end;
     end;
  by date;
   drop Price_lag Quantity_lag Time_lag TimeDiff i;
run;

data test_result;
    merge test1 test;
        by date time;
run;
proc print data=test_result; run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-3-5 14:12:17
yongyitian 发表于 2013-3-5 07:58
发错了,怎么删掉一贴。
data test;
input date yymmdd8. @12 T $4. price quantity;
先谢谢Y大提供的方式,小弟先尝试一下看看。
不过,有没有比较简单一点的写法阿...0.0
PS:

Y大,抱歉,有个小问题:

日期      成交时间(时/分) 价格 数量

20130101   0900                  500   2
20130101   0902                  502    1
20130101   0905                  498    3
20130101   0907                  499    1

小弟有一个要求是,
我的日期和成交时间是数字!!! 而不用变成时间的格式,
Y大的序语法,小弟跑出来会变成如下:

Date        prc qty  time

01JAN2013  500  2    9:00

而我希望的是,

Date        prc qty  time
20130101   500  2    0900
所以,不知道Y大是否能再修改一下程序语法….3Q



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-3-5 22:04:07
为什么日期时间不能用数值型的时间格式呢?
如果能的话,你的问题用proc timeseries可以一步做完
否则就麻烦多了,但有个可行的办法就是先生成一个日期时间表
然后把你现有的表left join过去,再补缺失值就好了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-3-5 23:40:38
楊中 发表于 2013-3-5 14:12
先谢谢Y大提供的方式,小弟先尝试一下看看。
不过,有没有比较简单一点的写法阿...0.0
PS:
我觉得应该有更简单的方法。
不知道怎样 把9小时1分钟用time format 表示成 0901。 我感觉 0901 是character 变量。 用下面的 data step 可一把小时分钟变成4位的character  variable。

Data test_result_1;
    set test_result;
    time_c = put( hour(time), z2.)||put(minute(time),z2.);
    date_c = put(year(date), z4.)||put(month(date),z2.)||put(day(date),z2.);
        * drop date time;
run;

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群