楼主: 楊中
5308 18

[问答] 求如何把遗漏的日期补上并补齐缺的数据 [推广有奖]

  • 0关注
  • 0粉丝

大专生

40%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
564 点
帖子
40
精华
0
在线时间
30 小时
注册时间
2012-10-1
最后登录
2022-5-2

楼主
楊中 发表于 2013-3-4 18:31:13 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

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

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,开始时刻不一定,需视第一笔数据时间为主往后补。




二维码

扫码加我 拉你入群

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

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

关键词:Deal 最后时刻 date time DEA 如何

沙发
yongyitian 发表于 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;

藤椅
yongyitian 发表于 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



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

地板
yongyitian 发表于 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;

7
楊中 发表于 2013-3-6 01:55:46
playmore 发表于 2013-3-5 22:04
为什么日期时间不能用数值型的时间格式呢?
如果能的话,你的问题用proc timeseries可以一步做完
否则就麻 ...
P大,由于小弟输进去的数据已经都是数值的关系,
且笔数相当多笔,所以才会这样要求并寻求帮忙。
至于proc timeseries这个语法,可以针对小弟的问题去补齐时间,
然后把缺失值补上? 怎使用呢? 能小小举例吗? 3Q~~^0^
另外,额外生成一个时间表的想法是不错,但是几十万笔的数据,
我就不知道该如何下手去弄,因为我是要补”数据有的天数”里面的”每分钟”数据。
数据大量,我就不知道该如何动手了 = =”

8
楊中 发表于 2013-3-6 02:05:41
yongyitian 发表于 2013-3-5 23:40
我觉得应该有更简单的方法。
不知道怎样 把9小时1分钟用time format 表示成 0901。 我感觉 09 ...
Y大不知道有没有误解小弟想表达的意思,
小弟想额外请问的是,如何直接对现有我输进去的数据,
(日期 成交时间都是数值格式了)
直接去补我遗失的成交时间(如:0901其实是9分1秒),
假使有0901和0903的成交时间,缺0902这笔,
小弟就需要补一笔0902的数据,然后其他变量的数据就跟前一笔相同。
小弟不才,原先Y大提供的方法,用在我的数据资料,
我去尝试之后,失败了 = =”

PS:901 902 903变成0901 0902 0903自动补0的方法小弟懂。

9
yongyitian 发表于 2013-3-6 04:11:28
能否把你输入的数据(dataset)传一部份上来看看.

10
playmore 发表于 2013-3-6 08:49:25
楊中 发表于 2013-3-6 01:55
P大,由于小弟输进去的数据已经都是数值的关系,
且笔数相当多笔,所以才会这样要求并寻求帮忙。
至于p ...
如果必须是字符型,而且只补原表存在日期条目的缺失时间
那么我觉得你先自己做张时间表,用下面的办法
  1. data TimeList;
  2.     do Time=0 to 86400 by 60;
  3.         output;
  4.     end;
  5.     format Time TIME.;
  6. run;

  7. data TimeList;
  8.         set TimeList;
  9.         Time_Char=CATS(PUT(HOUR(Time),z2.),PUT(MINUTE(Time),z2.));
  10. run;
复制代码
然后用原表的日期和这张表笛卡尔积下,得到日期和时间的完全表后,再把原表的数据连过来并填补缺失值就好了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-24 20:21