sas7bdat存储为数值的日期格式导入R后转换异常咨询
问题核心原因
你遇到的转换错误本质是对SAS时间存储规则和R的时间类型逻辑不熟悉导致的,不存在数值丢失的情况,具体说明如下:
- SAS有两类常用时间存储格式:纯日期值为1960-01-01至今的天数,datetime时间戳为1960-01-01 00:00:00至今的秒数。你导入的
SUBMITTED_AT和RUN_DATE都是SAS datetime类型,存储的是秒级数值,不是天数。 - 你用
as.Date(..., origin = "1970-01-01")转换报错的原因有两个:一是origin错用了Unix系统的1970基准,没有用SAS的1960基准;二是as.Date默认处理的是天级单位的数值,你把秒数当天数计算,自然会得到完全不符合预期的超多年份结果。 - 你用
as.POSIXct(..., origin='1960-01-01')得到的时间和SAS显示不一致是时区问题:SAS存储的datetime是不带时区的原始UTC时间,你本地R的时区默认是美国东部夏令时(EDT),比UTC慢4小时,所以原始的16:17:02会自动转换成12:17:02,不是转换错误。
正确转换方案
如果你需要和SAS显示的时间完全一致,转换时指定时区为UTC即可:
# 保留完整日期时间 wide$SUBMITTED_AT <- as.POSIXct(wide$SUBMITTED_AT, origin = "1960-01-01", tz = "UTC") wide$RUN_DATE <- as.POSIXct(wide$RUN_DATE, origin = "1960-01-01", tz = "UTC") # 仅需要日期的话,先转POSIXct再转Date即可 wide$RUN_DATE <- as.Date(as.POSIXct(wide$RUN_DATE, origin = "1960-01-01", tz = "UTC"))
你之前用format = "%Y-%m-%d"的临时方案只是隐藏了时间部分,底层存储的秒级数值是完整的,没有丢失,不需要担心数据损坏问题。
内容的提问来源于stack exchange,提问作者phargart
相关产品推荐
相关产品推荐

