【问题标题】:sas datetime to R date formatsas 日期时间到 R 日期格式
【发布时间】:2014-08-16 07:29:00
【问题描述】:

我有一个包含日期时间变量的 SAS 数据集。我已使用 sas7bdat 包将此数据集移植到 R 中,但 datetime 变量以整数格式显示(例如 1706835972)。有没有办法把这个整数转换成日期格式?

【问题讨论】:

  • 这看起来像一个 UNIX 时间戳。试试Convert UNIX epoch to Date object in R
  • SAS 使用自 1960 年 1 月 1 日以来的秒数,所以试试这个:as.POSIXct(1706835972, origin = "1960-01-01") 还有convertDateTime in Hmisc 转换 SAS 日期时间。如果您有一些来自 SAS 的值并且您知道正确答案,我们可以仔细检查这些值。
  • 成对,左值右格式:x=1706835972 格式:01FEB14:01:06:12 x=1716835972 格式:27MAY14:18:52:52 x=1726835972 格式:20SEP14:12:39 :32 x=1736835972 格式化: 14JAN15:06:26:12 x=1746835972 格式化: 10MAY15:00:12:52 x=1756835972 格式化: 02SEP15:17:59:32 x=1766835972 格式化: 26:17DEC15:11: x=1776835972 格式化:21APR16:05:32:52 x=1786835972 格式化:14AUG16:23:19:32 x=1796835972 格式化:08DEC16:17:06:12 x=1806835972 格式化:02APR17:10:52: 1816835972 格式:28JUL17:04:39:32 x=1826835972 格式:20NOV17:22:26:12
  • 还要注意SAS基本时间值没有时区,所以上面应该是UTC/GMT值,不是本地时区特定的。

标签: r sas datetime-format


【解决方案1】:

要准确匹配默认日期时间结构的 SAS 输出,您需要使用 as.POSIXct,如 cmets 中所述,另外使用 tz=UTC 参数:

sasDateTimes <- c(1706835972, 1716835972, 1726835972, 1736835972, 1746835972, 
1756835972, 1766835972, 1776835972, 1786835972, 1796835972, 1806835972, 
1816835972, 1826835972, 1836835972, 1846835972, 1856835972, 1866835972, 
1876835972, 1886835972, 1896835972, 1906835972, 1916835972, 1926835972, 
1936835972, 1946835972, 1956835972, 1966835972, 1976835972, 1986835972, 
1996835972)

rPOSIX <- as.POSIXct(sasDateTimes,origin='1960-01-01',tz="UTC")
rPOSIX
 [1] "2014-02-01 01:06:12 UTC" "2014-05-27 18:52:52 UTC" "2014-09-20 12:39:32 UTC" "2015-01-14 06:26:12 UTC" "2015-05-10 00:12:52 UTC" "2015-09-02 17:59:32 UTC"
 [7] "2015-12-27 11:46:12 UTC" "2016-04-21 05:32:52 UTC" "2016-08-14 23:19:32 UTC" "2016-12-08 17:06:12 UTC" "2017-04-03 10:52:52 UTC" "2017-07-28 04:39:32 UTC"
[13] "2017-11-20 22:26:12 UTC" "2018-03-16 16:12:52 UTC" "2018-07-10 09:59:32 UTC" "2018-11-03 03:46:12 UTC" "2019-02-26 21:32:52 UTC" "2019-06-22 15:19:32 UTC"
[19] "2019-10-16 09:06:12 UTC" "2020-02-09 02:52:52 UTC" "2020-06-03 20:39:32 UTC" "2020-09-27 14:26:12 UTC" "2021-01-21 08:12:52 UTC" "2021-05-17 01:59:32 UTC"
[25] "2021-09-09 19:46:12 UTC" "2022-01-03 13:32:52 UTC" "2022-04-29 07:19:32 UTC" "2022-08-23 01:06:12 UTC" "2022-12-16 18:52:52 UTC" "2023-04-11 12:39:32 UTC"

这些将与 SAS 以默认格式 (DATETIME17.) 显示的内容完美匹配。 SAS 输出:

x=1706835972, Formatted: 01FEB14:01:06:12
x=1716835972, Formatted: 27MAY14:18:52:52
x=1726835972, Formatted: 20SEP14:12:39:32
x=1736835972, Formatted: 14JAN15:06:26:12
x=1746835972, Formatted: 10MAY15:00:12:52
x=1756835972, Formatted: 02SEP15:17:59:32
x=1766835972, Formatted: 27DEC15:11:46:12
x=1776835972, Formatted: 21APR16:05:32:52
x=1786835972, Formatted: 14AUG16:23:19:32
x=1796835972, Formatted: 08DEC16:17:06:12
x=1806835972, Formatted: 03APR17:10:52:52
x=1816835972, Formatted: 28JUL17:04:39:32
x=1826835972, Formatted: 20NOV17:22:26:12
x=1836835972, Formatted: 16MAR18:16:12:52
x=1846835972, Formatted: 10JUL18:09:59:32
x=1856835972, Formatted: 03NOV18:03:46:12
x=1866835972, Formatted: 26FEB19:21:32:52
x=1876835972, Formatted: 22JUN19:15:19:32
x=1886835972, Formatted: 16OCT19:09:06:12
x=1896835972, Formatted: 09FEB20:02:52:52
x=1906835972, Formatted: 03JUN20:20:39:32
x=1916835972, Formatted: 27SEP20:14:26:12
x=1926835972, Formatted: 21JAN21:08:12:52
x=1936835972, Formatted: 17MAY21:01:59:32
x=1946835972, Formatted: 09SEP21:19:46:12
x=1956835972, Formatted: 03JAN22:13:32:52
x=1966835972, Formatted: 29APR22:07:19:32
x=1976835972, Formatted: 23AUG22:01:06:12
x=1986835972, Formatted: 16DEC22:18:52:52
x=1996835972, Formatted: 11APR23:12:39:32

如果将数据与时区更正一起输入 SAS,则应省略 tz 参数。但是,根据我的经验,SAS 日期时间通常不会存储在特定时区中。不幸的是,它们是否通常不会存储为数据集的一部分;您也许可以查看数据集上使用的格式(如果它是时区显示格式之一,那么它很可能确实包括时区),但即使这样也不能保证。您必须通过数据源验证日期时间是否与本地日期时间相关(即,从 1960 年 1 月 1 日本地时间午夜开始的秒数,或从 1960 年 1 月 1 日 UTC 午夜开始的秒数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多