使用频率或百分比开始时间和结束时间

时间:2014-07-07 21:06:13

标签: excel excel-vba sas excel-2010 vba

我有一个数据,其中包含开始时间,结束时间,停留时间(结束开始)和主题数量。我正在尝试创建一个图形,线条,条形图或直方图,显示在特定时间有多少主题。因此水平轴的时间从00:00到24:00,垂直轴的总数为#或%。

Start    End    Subject    Stay
01:00    02:00    1        01:00
01:00    01:45    1        00:45
02:00    21:00    1        19:00
03:10    14:10    1        11:00

数据集很大,我正在使用SAS Enterprise Guide和excel来创建图表。

我试过PROC GPLOT,但它没有提供我正在寻找的东西。对于线图和条形图(堆叠)做了同样的事情,但不能。我不确定是否有更简单的方法。这是我在SAS EG中使用的代码。尝试在excel中创建堆积条形图。

PROC GPLOT DATA=Input;
PLOT Stay * start  /
AREAS=1
FRAME   VAXIS=AXIS1
HAXIS=AXIS2
;

RUN; QUIT;

请帮忙。

由于

1 个答案:

答案 0 :(得分:0)

您需要转换数据,为您正在查看的每个时间段创建一行(例如,如果您想要显示每小时内任何时间点出现的人数,则为小时)。

您可以这样做:

data want;
set have;
do time=intnx('Hour',start,0) to end by 3600; *start at top of current hour, increment by 1 hour (3600 seconds);
  output;
end;
run;

然后,您可以在条形图中绘制time变量。

您的数据可能是某些方法(例如ETS)的问题,因为您正在使用重叠时段 - 您的主题1有4个重叠严重的停留。如果这些日期不同,您可能需要在主题中添加日标记以使其唯一。

使用您的数据的示例:

data have;
input Start :time5. End :time5. Subject Stay :time5.;
format start end stay time5.;
datalines;
01:00    02:00    1        01:00
01:00    01:45    2        00:45
02:00    21:00    2        19:00
03:10    14:10    3        11:00
;;;;
run;

data want;
set have;
do hour_mark = intnx('Hour',start,0) to end by 3600;
 output;
end;
keep hour_mark subject;
format hour_mark time5.;
run;

proc sgplot data=want;
vbar hour_mark;
run;

您可以使用更有趣的数据集运行相同的示例:

data have;
if _n_=1 then call streaminit(7);
do subject = 1 to 100;
    start=floor(rand('Uniform')*86000);*almost all day, but make sure we have a bit of room for end;
    end  =floor(rand('Uniform')*(86400-start))+start;
    stay=end-start;
    output;
end;
format start end stay time5.;
run;

然后使用相同的WANT和SGPLOT代码。