Расчет разницы во времени в сасе (военное время) - PullRequest
0 голосов
/ 15 мая 2018

У меня проблемы с выяснением того, как рассчитать длительность переменной времени. Есть мысли о том, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы можете извлечь часы и минуты из вашего числового значения военного времени ЧЧММ, а затем создать время SAS, используя функцию HMS().

  1. Извлечение часов: разделите ваш ЧЧММ на 100 и сохраните как целое число, чтобы получить часы,
  2. Извлечение минут: получите остаток (MOD) ЧЧММ на 100, чтобы получить минуты,
  3. Создать новую переменную времени, используя HMS(Hour,Minute,Second),
  4. Создайте новый Datetime для каждого, используя DHMS(date,hour,minute,second)

Полный код:

data have;
input sleep awake date_s date_w;
informat date_s date9. date_w date9.;
format sleep z4. awake  z4. date_s date9. date_w date9.;
datalines;
2300 0500 12feb2018 13feb2018
2000 0300 11feb2018 12feb2018
0530 1230 10feb2018 10feb2018
;
run;

data want;
set have;
new_sleep_time=hms(int(sleep/100),int(mod(sleep,100)),0);
new_awake_time=hms(int(awake/100),int(mod(awake,100)),0);
dt_awake=dhms(date_w,hour(new_awake_time),minute(new_awake_time),0);
dt_sleep=dhms(date_s,hour(new_sleep_time),minute(new_sleep_time),0);
diff=dt_awake-dt_sleep;
keep new_sleep_time new_awake_time dt_awake dt_sleep diff; 
format new_sleep_time time8. new_awake_time time8. diff time8. dt_awake datetime21. dt_sleep datetime21.;
run;

Выход:

 new_sleep_time=23:00:00 new_awake_time=5:00:00 diff=6:00:00 dt_awake=13FEB2018:05:00:00 dt_sleep=12FEB2018:23:00:00 
 new_sleep_time=20:00:00 new_awake_time=3:00:00 diff=7:00:00 dt_awake=12FEB2018:03:00:00 dt_sleep=11FEB2018:20:00:00 
 new_sleep_time=5:30:00 new_awake_time=12:30:00 diff=7:00:00 dt_awake=10FEB2018:12:30:00 dt_sleep=10FEB2018:05:30:00 
0 голосов
/ 16 мая 2018

Значение военного времени, закодированное как целое число h, hmm, может быть обработано путем преобразования числа в значение времени SAS и последующего выполнения дельта-вычислений с использованием определенных предположений.

data sleep_log;
  input name $ boots_down boots_up;
datalines;
Joe 2000 0600 slept over midnight
Joe 1000 1230 slept into lunch
Joe 1630 1700 30 winks
Joe 0100 0100 out cold!
run;

data sleep_data;
  set sleep_log;
  down = hms(
      int(boots_down / 100) /* extract hours */
    , mod(boots_down , 100) /* extract minutes */
    , 0 /* seconds not logged, use zero */
  );
  up = hms(
      int(boots_up / 100) /* extract hours */
    , mod(boots_up , 100) /* extract minutes */
    , 0 /* seconds not logged, use zero */
  );

  * SAS time values are linear and simple arithmetic can apply;

  if up <= down 
    then delta = '24:00't + up - down; /* presume roll over midnight */
    else delta = up - down;

  format down up delta time5.;
run;

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

...