Как упоминал Reeza в комментариях, один из способов сделать это - подготовить данные с помощью proc timeseries
, используя опции start=
и end=
. Простой способ динамически получить начальные / конечные значения - это извлечь их из данных и заранее сохранить их в макропеременных.
proc sql noprint;
select min(time) format=datetime.
, max(time) format=datetime.
into :mintime
, :maxtime
from have
;
quit;
proc timeseries data=have
out=want;
by id;
id time interval = minute15.
start = "&mintime."dt
end = "&maxtime."dt
accumulate = max
setmissing = 0
;
var occupancy co2 humidity;
run;
Второй способ сделать это без получения минимальных / максимальных значений - сначала подготовка данных с помощью proc timeseries
и последующая обработка через proc expand
для заполнения пропущенных значений.
Данные в формате datalines
приведены ниже.
data have;
format time datetime.;
infile datalines dlm=',';
input device$ occupancy time:anydtdtm. co2 humidity id;
datalines;
A, 1, 2019-03-27 10:17:22, 848.0, 44.653748, 1
A, 1, 2019-03-27 10:17:22, 848.0, 44.653748, 2
B, 1, 2019-03-27 10:17:22, 848.0, 41.653748, 3
B, 1, 2019-03-27 10:17:22, 848.0, 41.653748, 4
C, 1, 2019-03-27 08:02:05, 685.0, 39.968201, 5
D, 1, 2019-03-27 12:16:53, 793.0, 35.641235, 6
;
run;