按月分组SAS日期

时间:2016-08-25 09:59:03

标签: date sas

我目前有一些采用日期格式的数据,但基础信息实际上仍然是SAS日期编号。因此,当我开始依赖这个字段时,我会为每个SAS编号分别获取一行,而且这些信息不会按照我希望的那样按月分组。

我的数据看起来像这样;

data beforehave;
   input ID  $ Activity $ Origianl_Start_Date;
   datalines;
   12345 Activity1 Oct-13
   12345 Activity1 Oct-13
   12345 Activity1 Nov-16
   12345 Activity2 Nov-16
   12345 Activity2 Nov-16
   23145 Activity1 Sep-15
   23145 Activity2 Sep-15
   23145 Activity2 Sep-15
;
RUN;

然而,当涉及'Original_Start_Date'类别的计数排列时,我得到了这个

data beforehave;
   input ID  $ Activity $ Origianl_Start_Date Count_of_Original_Start_Date;
   datalines;
   12345 Activity1 Oct-13 1
   12345 Activity1 Oct-13 1
   12345 Activity1 Nov-16 1
   12345 Activity2 Nov-16 1
   12345 Activity2 Nov-16 1
   23145 Activity1 Sep-15 1
   23145 Activity2 Sep-15 1
   23145 Activity2 Sep-15 1
;
RUN;

然而我想要的是这个。

data beforehave;
   input ID  $ Activity $ Origianl_Start_Date Count_of_Original_Start_Date;
   datalines;
   12345 Activity1 Oct-13 2
   12345 Activity1 Nov-16 1
   12345 Activity2 Nov-16 2
   23145 Activity1 Sep-15 1
   23145 Activity2 Sep-15 2
;
RUN;

我曾考虑过把它变成一种字符格式但是将它作为日期保留起来真的很有用。

我真正想要的是能够根据月份对SAS日期编号进行分组。

2 个答案:

答案 0 :(得分:2)

在我的评论中提到,以下是实现目标的两种方法。最简单的是proc summary,因为它会按格式化值自动分组。第二个选项是在groupformat语句中使用by选项的数据步骤,这需要事先proc sort

data have;
   input ID  $ Activity $10. Original_Start_Date :date7.;
   format Original_Start_Date monyy5.;
   datalines;
   12345 Activity1 01Oct13
   12345 Activity1 02Oct13
   12345 Activity1 03Nov16
   12345 Activity2 04Nov16
   12345 Activity2 05Nov16
   23145 Activity1 06Sep15
   23145 Activity2 07Sep15
   23145 Activity2 08Sep15
;
RUN;

/* method 1 */
proc summary data=have nway;
class id activity original_start_date;
output out=want1 (drop=_type_ rename=(_freq_=Count_of_Original_Start_Date));
run;

/* method 2 */
proc sort data=have;
by id activity original_start_date;
run;

data want2;
set have;
by id activity original_start_date groupformat;
if first.original_start_date then Count_of_Original_Start_Date=0;
Count_of_Original_Start_Date+1;
if last.original_start_date then output;
run;

答案 1 :(得分:0)

我更喜欢使用proc sql:

data have;
  input ID  $ Activity $10. Original_Start_Date :date7.;
  format Original_Start_Date monyy5.;
  datalines;
  12345 Activity1 01Oct13
  12345 Activity1 02Oct13
  12345 Activity1 03Nov16
  12345 Activity2 04Nov16
  12345 Activity2 05Nov16
  23145 Activity1 06Sep15
  23145 Activity2 07Sep15
  23145 Activity2 08Sep15
;
Run;

proc sql;
    create table want as
    select ID,Activity,Original_Start_Date,count(*) as Count_of_Original_Start_Date
    from have
    group by 1,2,3;
quit;