SAS中时间变量转数值及睡眠时长分类错误问题咨询
问题根因
你遇到的分类错误核心是跨天睡眠的时间差值计算逻辑疏漏:
SAS的时间型变量底层存储是当日0点以来的秒数,如果你入睡时间是前一天、起床是第二天,直接用waketime - bedtime计算得到的是负数,而非你看到的格式化显示的正值时长,负数自然会被判定为小于7小时,才会出现9小时睡眠被错误赋值sleep=1的问题。你之前看到sleeptime显示为09:00:00是变量格式化的效果,底层实际存储的负数在按时间格式展示时会自动加86400(一天总秒数)显示为当天的时间,但比较判断时用的是底层存储的秒数,才会出现显示和判断结果不一致的情况。
方案1:修正时间差值计算后直接分类
先处理跨天的差值,再做分类判断即可:
data have; set want; * 计算睡眠秒数,跨天则加1天的总秒数86400; sleeptime = waketime - bedtime; if sleeptime < 0 then sleeptime = sleeptime + 86400; * 直接用秒数判断,7小时等于25200秒; if sleeptime >= 25200 then sleep=0; else sleep=1; run;
方案2:转换为小时数值再分类
如果需要保留以小时为单位的数值字段,在修正差值后除以3600即可:
data have; set want; sleeptime = waketime - bedtime; if sleeptime < 0 then sleeptime = sleeptime + 86400; * 转换为小时,保留位数可根据需求调整; sleeptime1 = round(sleeptime / 3600, 0.1); if sleeptime1 >=7 then sleep=0; else sleep=1; run;
内容的提问来源于stack exchange,提问作者elemarles
相关产品推荐
相关产品推荐

