首页 > 解决方案 > 如何在r中循环显示真实日期

问题描述

当我在循环中迭代日期时,R 会打印出日期的数字编码。

例如:

dates <- as.Date(c("1939-06-10", "1932-02-22", "1980-03-13", "1987-03-17",
                    "1988-04-14", "1979-08-28", "1992-07-16", "1989-12-11"), tryFormats = c("%Y-%m-%d"))

for(d in dates){

  print(d)
}

输出如下:

[1] -11163
[1] -13828
[1] 3724
[1] 6284
[1] 6678
[1] 3526
[1] 8232
[1] 7284

如何让 R 打印出实际日期?所以输出显示:

[1] "1939-06-10" 
[1] "1932-02-22" 
[1] "1980-03-13" 
[1] "1987-03-17" 
[1] "1988-04-14" 
[1] "1979-08-28" 
[1] "1992-07-16" 
[1] "1989-12-11"

谢谢!

标签: rloopsdate

解决方案


当您在 R中的循环中使用datesas时,它会丢失其属性。seqfor

您可以使用as.vector剥离属性并亲自查看(或dput查看完整对象的幕后情况):

as.vector(dates)
# [1] -11163 -13828   3724   6284   6678   3526   8232   7284
dput(dates)
# structure(c(-11163, -13828, 3724, 6284, 6678, 3526, 8232, 7284), class = "Date")

在 R 中,Date对象只是带有(是一个属性) 的numeric向量。class Dateclass

因此,您会看到数字(FWIW,这些数字从 开始计算天数1970-01-01)。

要恢复Date属性,可以使用.Date函数:

for (d in dates) print(.Date(d))
# [1] "1939-06-10"
# [1] "1932-02-22"
# [1] "1980-03-13"
# [1] "1987-03-17"
# [1] "1988-04-14"
# [1] "1979-08-28"
# [1] "1992-07-16"
# [1] "1989-12-11"

这相当于as.Date(d, origin = '1970-01-01')numeric方法为as.Date

有趣的是,*apply函数不会剥离属性:

invisible(lapply(dates, print))
# [1] "1939-06-10"
# [1] "1932-02-22"
# [1] "1980-03-13"
# [1] "1987-03-17"
# [1] "1988-04-14"
# [1] "1979-08-28"
# [1] "1992-07-16"
# [1] "1989-12-11"

推荐阅读