【问题标题】:convert numeric column to dates recognized by R将数字列转换为 R 识别的日期
【发布时间】:2021-05-02 00:33:40
【问题描述】:

如何将这个数字的日期向量转换为 R 可以识别的日期格式?

date <- c(29101958L, 10121957L, 27091953L, 23021960L, 
           6031967L, 10011968L, 10101958L, 9101992)

我想要这样的输出:

'1958-10-29', '1957-12-10', '1953-09-27', '1960-02-23', '1967-03-06', '1968-01-10', '1958-10-10', '1992-10-09'

然后我想通过向量的日期与 2016-12-31 之间的差异来计算年龄。

感谢您的帮助。

【问题讨论】:

  • 感谢@akrun,我在问题中提供了更多信息!
  • 我想知道问题是否在于您最初是如何阅读它的。如果你有一个号码1111958L,是1958-01-11 还是1958-11-01?虽然dmy 会很接近,但这里肯定有模棱两可的余地。也许在获取数据时问题会得到更好的解决。 (例如,如果使用read.* 之一,则可以使用colClasses= 强制此列为character 而不是integer。)

标签: r date lubridate date-conversion


【解决方案1】:

我们可以从lubridate使用dmy

library(lubridate)
newdate <- dmy(date)

newdate
#[1] "1958-10-29" "1957-12-10" "1953-09-27" "1960-02-23" "1967-03-06" "1968-01-10" "1958-10-10" "1992-10-09"

并获得新日期之间的年差

as.integer(difftime(as.Date('2016-12-31'), newdate, units = 'days')/365)
#[1] 58 59 63 56 49 49 58 24

【讨论】:

    【解决方案2】:

    使用as.Date 的基本 R 选项:

    as.Date(sprintf('%08d', date), '%d%m%Y')
    
    #[1] "1958-10-29" "1957-12-10" "1953-09-27" "1960-02-23" "1967-03-06"
    #[6] "1968-01-10" "1958-10-10" "1992-10-09"
    

    使用sprintf,我们为单个数字日期添加前导零。

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2023-01-26
      • 1970-01-01
      • 2021-03-07
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2022-01-27
      相关资源
      最近更新 更多