【问题标题】:Returning a Date from a Function Using sapply()使用 sapply() 从函数返回日期
【发布时间】:2015-07-17 08:43:36
【问题描述】:

我对 R 中的日期有疑问。

我有一些日期数据,但是格式不一致。根据一个月中的哪一天,它被存储为 dmmyyyy 或 ddmmyyyy。为了解决这个问题,我编写了一个小函数(见下文),它接受字符串、检查长度、重新格式化然后返回日期。我使用 sapply(dates, formatDate) 并且根据我的打印输出,一切都按预期工作。然而,结果向量不包含相同的值。

head(dates)
#> [1] 10651 11566 15493 13727 15920 15617

我不确定这里发生了什么,有什么见解吗?

formatDate <- function(x){

  print(paste("Entering format date for ", x))

  if (nchar(x) == 8){

    print(paste("nchar = ", nchar(x)))

    day   <- substr(x, 1, 2)
    month <- substr(x, 3, 4)
    year  <- substr(x, 5, 8)

    print(paste("Day = ", day, " month = ", month, " year = ", year))

    x  <- paste(year,"-",month,"-",day, sep = "")

    print(paste("Date = ", x))

    x  <- as.Date(x, format = "%Y-%m-%d")

  } else if (nchar(x) == 7){

    day   <- substr(x, 1, 1)
    day   <- format(day, digits = 2)
    day   <- gsub(" ", 0, day)
    month <- substr(x, 2, 3)
    year  <- substr(x, 4, 7)

    x  <- paste(year,"-",month,"-",day, sep = "")
    x  <- as.Date(x, format = "%Y-%m-%d")

  } else {

    x <- NA

  }

  print(paste("Returning", x))
  flush.console()
  return(x)

 } 

【问题讨论】:

  • 看起来您正在获取数值。要转换为日期,如果我理解您的问题,您可以使用 as.Date(yourreturnvector), origin='1970-01-01')
  • 太好了,感谢您的帮助!我曾尝试返回 as.Date(x),但我没有意识到我可以在整个向量上使用它。一个问题 - 我需要使用 origin 参数吗?
  • 原因是sapply 可能会在长度相同的情况下将list 更改为矩阵左右,并且日期将被强制转换为它存储的数值。最好使用lapply 来避免这种情况
  • 是的,您需要origin 参数
  • simplify = FALSE 也可以阻止 sapply 以“折叠”结果。

标签: r


【解决方案1】:

这看起来太复杂了。如果我理解正确,您可以这样做:

x <- c("1072015", "11072015")
as.Date(formatC(as.integer(x), width = 8, flag = 0), format = "%d%m%Y")
#[1] "2015-07-01" "2015-07-11"

【讨论】:

  • 谢谢。增加的并发症是在该月的 1 日至 9 日,格式为 dmmyyyy 而不是 ddmmyyyy。我可以在其他日期使用您的建议。我想我必须在其他日期的开头添加一个 0。
  • 不,正如这个例子清楚地表明,你没有。 formatC 在这里用零填充。
  • 我现在明白了,对不起,这是完美的。感谢您的帮助!
  • 虽然我喜欢开箱即用的想法,但它并没有回答这个问题:使用 sapply() 从函数返回日期
【解决方案2】:

尽管 Roland 说得对,这需要一种完全不同的方法,但我实际上是在寻找 OP 问题的答案:使用 sapply() 从函数返回日期。

简单的答案是:sapply() 不能返回日期。但是如果你想使用sapply() 强制日期,你可以使用as.Date() 和正确的origin 来返回日期。示例日期和函数:

dates <- c("October 21 2012", "Sep 22 2019")

guess_date <- function(x) {
  # just for test purposes: try to coerce 2 different date formats
  if (is.na(as.Date(x, "%b %d %Y"))) {
    # format mmm dd yyyy
    return(as.Date(x, "%b %d %Y"))
  } else {
     # format mmmm dd yyyy
    return(as.Date(x, "%B %d %Y"))
  }
}

所以guess_date() 将始终返回一个类Date。但是现在检查sapply()

sapply(dates, guess_date)
#> October 21 2012     Sep 22 2019 
#>           15634           18161 

你在寻找什么:

as.Date(sapply(dates, guess_date), origin = "1970-01-01")
#> October 21 2012     Sep 22 2019 
#>    "2012-10-21"    "2019-09-22" 

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多