R日期时间转换 - lapply和unlist转换为纪元后的天数

时间:2016-09-26 02:02:55

标签: r

我正在转换一个字符串,其日期看起来像12/8/12,可能是以相当迂回的方式1)将前导零(零填充)添加到日期和月份数字,然后使用{转换为日期对象{1}}函数在我写的自定义函数中。

as.Date

令我感到非常困惑的是,当我在一个输入上调用该函数时,我可以取回我想要的结果:

date_conversion <-  function(date_string){
  split <- unlist(strsplit(date_string, "/"))  
  split[1] = str_pad(split[1], 2, pad = "0")
  split[2] = str_pad(split[1], 2, pad = "0")
  t = as.Date(paste(split, collapse = "/"),format='%m/%d/%y')
  return (t)
}

然后当我使用> date_conversion(test[1]) [1] "2012-12-12" > typeof(date_conversion(test[1])) [1] "double" 时,它返回此字符串表示形式:

lapply

然后,当我致电 > lapply(test, date_conversion) [[1]] [1] "2012-12-12" [[2]] [1] "2015-12-12" [[3]] [1] "2015-09-09" 时,日期会更改为自纪元以来的天数:

unlist

我想日期的基础表示是自纪元以来的几天(因此 unlist(lapply(test, date_conversion)) [1] 15686 16781 16687 返回double,但为什么列表值会以更易读的形式显示格式,然后调用typeof make自从时代形成以来,它们又回到了今天?

另外,有一种优雅的方式让我进行这样的转换吗?也许我不应该使用Lapply?

2 个答案:

答案 0 :(得分:3)

lubridate包有另一个解决方案:

test <- c("12/8/12", "1/1/13", "2/4/13")

dates <- lubridate::mdy(test)
##[1] "2012-12-08" "2013-01-01" "2013-02-04"

class(dates)
##Date[1:3], format: "2012-12-08" "2013-01-01" "2013-02-04"

str(dates)
##[1] "Date"

lubridate函数mdy()将对象test中的字符串转换为月(m),天(d)和年(y)。 如果您的对象test是一个列表,则可以使用lubridate::mdy((unlist(test))与aichao所写的答案相同。

答案 1 :(得分:1)

您不需要date_conversion功能,因为as.Date将使用日期字符串的格式,并且它是矢量化的。因此,如果test是您日期的字符串向量:

test <- c("12/8/12", "1/1/13", "2/4/13")
print(result)
result <- as.Date(test, format="%m/%d/%y")
##[1] "2012-12-08" "2013-01-01" "2013-02-04"
str(result)
##Date[1:3], format: "2012-12-08" "2013-01-01" "2013-02-04"
class(result)
##[1] "Date"

如果testlist,那么首先unlist(即as.Date(unlist(test), format="%m/%d/%y"))。