Расчет времени начала в пределах 1 часа для каждого человека (один столбец) - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь выяснить, как рассчитать, если время начала для каждого предмета происходит в течение 1 часа друг от друга. Однако у меня есть только один столбец и две группы с двумя разными датами для каждой. У меня нет сравнительной переменной к разнице во времени в дхм, поскольку они встречаются под одной и той же переменной столбца Я подумал о том, чтобы выполнить задержку в первый раз, а затем использовать intchk для вычисления 24-часовой разницы во времени между ними, но я не думаю, что у меня достаточно аргументов для функции intchk. В качестве альтернативы, возможно, можно сделать pro c транспонирование, а затем сделать timediff между каждой переменной массива, но это кажется грязным. У любого есть менее неуклюжие и более эффективные решения, поскольку я мог бы переосмыслить это.

Пример данных :

+----------+-------+------+------------+------------+
| CLIENTID | GRPID | date | start_date | start_time |
+----------+-------+------+------------+------------+
|        2 |     1 |   -2 | 10Nov2019  | 23:19:52   |
|        3 |     1 |   -2 | 10Nov2019  | 23:22:51   |
|        4 |     1 |   -2 | 10Nov2019  | 23:20:16   |
|        5 |     1 |   -2 | 10Nov2019  | 23:21:30   |
|        6 |     1 |   -2 | 10Nov2019  | 23:23:51   |
|       23 |     2 |   -2 | 11Nov2019  | 23:11:38   |
|       24 |     2 |   -2 | 11Nov2019  | 23:38:33   |
|       25 |     2 |   -2 | 11Nov2019  | 23:15:01   |
|       26 |     2 |   -2 | 11Nov2019  | 23:08:43   |
+----------+-------+------+------------+------------+

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вы можете скомпилировать дату и время начала во временную переменную datetime (_start_dt), чтобы упростить сравнение. Затем, взяв первое значение даты и времени для каждого GRPID в качестве базовой линии, вы можете использовать оператор RETAIN, чтобы передать эту базовую дату и время (_base_dt) вниз по связанным строкам данных и найти разницу во времени (time_diff), используя INTCK функция с интервалом dtsecond.

proc sort data=your_data;
    by grpid clientid;
run;

data your_results (drop=_:);
    retain CLIENTID GRPID DATE start_date start_time _base_dt;
    format _base_dt _start_dt datetime16. time_diff time8.;
    set your_data;
    by grpid clientid;
    _start_dt = dhms(start_date,hour(start_time),minute(start_time),second(start_time));
    if first.grpid then _base_dt = _start_dt;
    time_diff = intck('dtsecond', _base_dt, _start_dt);
run;

Это дает следующий набор данных результатов:

+----------+-------+------+------------+------------+-----------+
| CLIENTID | GRPID | date | start_date | start_time | time_diff |
+----------+-------+------+------------+------------+-----------+
|        2 |     1 |   -2 | 10Nov2019  | 23:19:52   | 00:00:00  |
|        3 |     1 |   -2 | 10Nov2019  | 23:22:51   | 00:02:59  |
|        4 |     1 |   -2 | 10Nov2019  | 23:20:16   | 00:00:24  |
|        5 |     1 |   -2 | 10Nov2019  | 23:21:30   | 00:01:38  |
|        6 |     1 |   -2 | 10Nov2019  | 23:23:51   | 00:03:59  |
|       23 |     2 |   -2 | 11Nov2019  | 23:11:38   | 00:00:00  |
|       24 |     2 |   -2 | 11Nov2019  | 23:38:33   | 00:26:55  |
|       25 |     2 |   -2 | 11Nov2019  | 23:15:01   | 00:03:23  |
|       26 |     2 |   -2 | 11Nov2019  | 23:08:43   | -0:02:55  |
+----------+-------+------+------------+------------+-----------+

Я думаю Я правильно истолковал ваши требования. Дайте мне знать, если нет.

0 голосов
/ 20 января 2020

Звучит так, как будто вы хотите проверить, является ли RANGE из start_time над каждым group < 1 hour:

Привести start_date к значению даты и времени и добавить start_time перед вычислением диапазона.

data have;
input 
CLIENTID  GRPID  date  start_date: date9. start_time: hhmmss6.;
format start_date date9. start_time time8.;
datalines;
 2      1    -2  10Nov2019   23:19:52   
 3      1    -2  10Nov2019   23:22:51   
 4      1    -2  10Nov2019   23:20:16   
 5      1    -2  10Nov2019   23:21:30   
 6      1    -2  10Nov2019   23:23:51   
23      2    -2  11Nov2019   23:11:38   
24      2    -2  11Nov2019   23:38:33   
25      2    -2  11Nov2019   23:15:01   
26      2    -2  11Nov2019   23:08:43   
run;

proc sql;
  create table want (label="start range status by group") as
  select 
    grpid,
    range(dhms(start_date,0,0,0)+start_time) as start_range format time8.,
    calculated start_range < '24:00:00't as one_hr_start_flag
  from have
  group by grpid;

Если вы хотите игнорировать группы и сосредоточиться только на времени суток , без учета даты, вычисление диапазона будет:

* Presuming 'noon' is the center of the day;
proc sql;
  create table want (label="time of day start range status overall") as
  select 
    range(start_time) as range format time8.,
    calculated range < '24:00:00't as one_hr_start_flag
  from have;

Просмотр только времени всегда проблематичен для случаев, когда значение времени немного больше полуночи.

...