楼主: LinYouthen
5113 4

菜鸟求助各路前辈,请问如何算相隔两次打卡的时间差 [推广有奖]

  • 1关注
  • 0粉丝

已卖:8份资源

副教授

27%

还不是VIP/贵宾

-

威望
0
论坛币
1678 个
通用积分
0
学术水平
0 点
热心指数
2 点
信用等级
1 点
经验
53994 点
帖子
58
精华
0
在线时间
1517 小时
注册时间
2010-8-29
最后登录
2024-8-27

楼主
LinYouthen 发表于 2013-8-13 01:21:14 |AI写论文
10论坛币
有下面的一段数据表A(我只取了100万行数据前十行):
姓名进入时间离开时间
小明2013/05/23  09:08:222013/05/23  11:08:22
小明2013/05/24  04:03:122013/05/24  16:25:01
小明2013/05/26  19:08:222013/05/26  22:52:11
小明2013/05/27  02:35:222013/05/27  09:08:22
小红2013/05/21 01:56:212013/05/23  08:08:08
小红2013/05/23  23:08:222013/05/24  02:01:11
小张2013/06/01  15:05:252013/06/01  24:00:00
小陆2013/06/03  02:03:262013/06/03  09:11:55
小陆2013/06/20  02:03:422013/06/23  12:18:56


现在要做一下分析:

(1)计算每个人每相隔两次进入日期之差,返回天数,如果天数大于30,进行标记并在数据集B(候选名单)中删除;如果某个人(如小张)只进入过一次的,进行标记也在数据集B(候选名单)中删除。
(2)提取六月1号后一个月内某人进入的最早时间、以及六月1号前一个月这个人进入的最后时间之差,如果差值超过30天标记为1,少于30天标记为零,如果六月一号前一个月没有登录,也标记为1。
(3)计算每个人在五月1日到六月1日期间,到位时间总和,返回秒(每次到位时间=离开时间-进入时间)。
急需解决,等待大神



关键词:时间差 候选名单 急需解决 SOSO 数据集 时间差 如何
无忧无虑无烦恼

沙发
book992008 在职认证  发表于 2013-8-13 07:29:17
顶起
book992008

藤椅
yongyitian 发表于 2013-8-13 11:34:44
Question 2;
  1. data a1;
  2. length name $15.;
  3. format date1 date2 yymmdd10. time1 time2 time8.;
  4. input name :$ date1 :yymmdd10. time1 :time8. date2 :yymmdd10. time2 :time8.;
  5. datalines;
  6. XiaoMing 2013/05/23 09:08:22 2013/05/23 11:08:22
  7. XiaoMing 2013/05/24 04:03:12 2013/05/24 16:25:01
  8. XiaoMing 2013/05/26 19:08:22 2013/05/26 22:52:11
  9. XiaoMing 2013/05/28 02:35:22 2013/05/27 09:08:22
  10. XiaoMing 2013/06/26 02:35:22 2013/06/27 09:08:22
  11. XiaoHong 2013/05/21 01:56:21 2013/05/23 08:08:08
  12. XiaoHong 2013/05/23 23:08:22 2013/05/24 02:01:11
  13. XiaoHong 2013/06/23 23:08:22 2013/06/24 02:01:11
  14. XiaoZhang 2013/01/01 15:05:25 2013/01/01 24:00:00
  15. XiaoZhang 2013/06/01 15:05:25 2013/06/01 24:00:00
  16. XiaoLu 2013/05/03  02:03:26 2013/05/03 09:11:55
  17. XiaoLu 2013/06/07  02:03:26 2013/06/03 09:11:55
  18. XiaoLu 2013/06/29  02:03:42 2013/06/23 12:18:56
  19. ; run;

  20. proc sql;
  21.       create table b1 as
  22.       select m6.name, m6.FirstJunDate, m5.lastMaydate,
  23.             (m6.firstJunDate - m5.lastMayDate) as days,
  24.              case when calculated days < 30 then 0
  25.              else 1
  26.              end as flag
  27.        from (select name, date1 as FirstJundate
  28.              from a1
  29.              where month(date1) = 6
  30.              group by name
  31.              having date1 = min(date1)
  32.              ) as m6
  33.        left join
  34.             (select name, date1 as LastMaydate
  35.              from a1
  36.              where month(date1) = 5
  37.              group by name
  38.              having date1 = max(date1)
  39.              ) as m5
  40.        on m6.name=m5.name;
  41. quit;
复制代码

板凳
akakak123 发表于 2013-8-14 11:46:15
data a;                                                                                                                                 
length name $15.;                                                                                                                       
input name $ date1 $10. time1 $ date2 $10. time2 $ ;                                                                                    
datalines;                                                                                                                              
XiaoMing 2013/05/23 09:08:22 2013/05/23 11:08:22                                                                                       
XiaoMing 2013/05/24 04:03:12 2013/05/24 16:25:01                                                                                       
XiaoMing 2013/05/26 19:08:22 2013/05/26 22:52:11                                                                                       
XiaoMing 2013/05/27 02:35:22 2013/05/27 09:08:22                                                                                       
XiaoMing 2013/06/26 02:35:22 2013/06/27 09:08:22                                                                                       
XiaoHong 2013/05/21 01:56:21 2013/05/23 08:08:08                                                                                       
XiaoHong 2013/05/23 23:08:22 2013/05/24 02:01:11                                                                                       
XiaoHong 2013/06/23 23:08:22 2013/06/24 02:01:11                                                                                       
XiaoZhang 2013/01/01 15:05:25 2013/01/01 24:00:00                                                                                       
XiaoZhang 2013/06/01 15:05:25 2013/06/01 24:00:00                                                                                       
XiaoLu 2013/05/03  02:03:26 2013/05/03 09:11:55                                                                                         
XiaoLu 2013/06/03  02:03:26 2013/06/03 09:11:55                                                                                         
XiaoLu 2013/06/23  02:03:42 2013/06/29 12:18:56                                                                                         
XiaoJiu 2013/06/01 15:05:25 2013/06/01 24:00:00                                                                                         
;                                                                                                                                       
run;                                                                                                                                    
                                                                                                                                       
data a1;                                                                                                                                

                                                                                                                                       
set a;                                                                                                                                 

                                                                                                                                       
indate1=input(date1,yymmdd10.);                                                                                                         

                                                                                                                                       
intime=put(indate1,date9.)||' '||time1;                                                                                                

                                                                                                                                       
intime1=input(intime,DATETIME18.);                                                                                                      

                                                                                                                                       
outdate1=input(date2,yymmdd10.);                                                                                                        

                                                                                                                                       
outtime=put(outdate1,date9.)||' '||time2;                                                                                               

                                                                                                                                       
outtime1=input(outtime,DATETIME18.);                                                                                                   

                                                                                                                                       
usetime=outtime1-intime1;                                                                                                               
run;                                                                                                                                    
                                                                                                                                       
proc sort data=a1 out=a2;                                                                                                               
by name;                                                                                                                                
run;                                                                                                                                    
data a3;                                                                                                                                
set a2;                                                                                                                                 
by name;                                                                                                                                
retain x;                                                                                                                              
if first.name then x=0;                                                                                                                 
x+1;                                                                                                                                    
run;                                                                                                                                    
data a4;
                                                                                                                              
set a2;                                                                                                                                 
by name;                                                                                                                                
retain y;                                                                                                                              
if first.name then y=0;                                                                                                                 
y+1;                                                                                                                                    
if last.name then output;                                                                                                               
keep name y;                                                                                                                           
run;                                                                                                                                    
data fa;                                                                                                                                
merge a3 a4;                                                                                                                           
by name;                                                                                                                                
run;                                                                                                                                    
data b1;                                                                                                                                
set fa;                                                                                                                                 
if y=1 then delete;                                                                                                                     
if dif(x)>0 and dif(indate1)>30 then delete;                                                                                            
run;                                                                                                                                    
data b2;                                                                                                                                
set fa(keep=name date1 indate1 x);                                                                                                      

mouth=substr(date1,6,2);                                                                                                               

demouth=lag(mouth);
                                                                                                                  
if x=1 then demouth=.;                                                                                                                  
if mouth-demouth>0 and dif(indate1)>30 then mark=1;                                                                                    
else if mouth =06 and demouth=. then mark=1;                                                                                            
else mark=0;                                                                                                                           
drop mouth demouth x;                                                                                                                  
run;                                                                                                                                    
data fa1;                                                                                                                              
set fa;                                                                                                                                 
indate='2013/05/01';                                                                                                                    
outdate='2013/06/01';                                                                                                                  
if indate<date1<outdate then output;                                                                                                   
run;                                                                                                                                    
data b3;                                                                                                                                
set fa1;                                                                                                                                
by name;                                                                                                                                
retain worktime;                                                                                                                        
if first.name then worktime=0;                                                                                                         
worktime=worktime+usetime;                                                                                                              
if last.name then output;                                                                                                               
run;
              
B1 B2 B3是结果   

报纸
LinYouthen 发表于 2013-8-18 01:05:20
akakak123 发表于 2013-8-14 11:46
data a;                                                                                              ...
太感谢上面两位大侠的了,我真的受益匪浅!

可是我还有些不懂要请问一下@akakak123,问题二好像没有解决,请问一下以下这段代码是什么意思呢?demouth=lag(mouth);                                                                                                  
if x=1 then demouth=.;                                                                                                                  if mouth-demouth>0 and dif(indate1)>30 then mark=1;                                                                                    
else if mouth =06 and demouth=. then mark=1;  

我没有弄懂这段代码的意思,可以麻烦您简单解释一下吗,谢谢!



无忧无虑无烦恼

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-9 07:07