【问题标题】:How to convert dates in R from multiple formats at once?如何一次将R中的日期从多种格式转换?
【发布时间】:2020-05-28 23:02:55
【问题描述】:

我在数据框中有一个源列,其中日期可能是“dd.mm.yyyy”格式或 5 位数字的 Excel 格式。因此,我想用ifelse 检查元素在str_detect 下的样子,然后为每个元素使用适当的转换。

df$date <- ifelse(str_detect(df$date, "[0-9]{2}.[0-9]{2}.[0-9]{4}") == TRUE, 
                      as.Date(df$date, format = "%d.%m.%Y"),
                      as.Date(as.numeric(df$date), origin = "1899-12-30"))

虽然两个转换函数都按预期工作,但当我将它们放入 ifelse 语句时,我得到了奇怪的结果 - 基本上 2019 年 1 月 1 日变成了“17897”。有人可以解释为什么会发生这种情况以及我如何使它起作用吗?谢谢

编辑:代码 sn-p

  df <- c("01.01.2019", "43867")
  df <- ifelse(str_detect(df, "[0-9]{2}.[0-9]{2}.[0-9]{4}") == TRUE,
                      as.Date(df, format = "%d.%m.%Y"),
                      as.Date(as.numeric(df), origin = "1899-12-30"))

所需输出:"2019-01-01" "2020-02-06" 结果输出17897 18298 如果我在没有ifelse 的情况下应用第一个(是)函数,我将得到"2019-01-01" NA,并且没有函数导致NA "2020-02-06"

【问题讨论】:

  • 有趣的问题,最好有一个 reproducible example 和数据的 sn-p 来测试解决方案。
  • 你能给出例子和预期的输出
  • 阅读ifelse的帮助页面,特别是警告。
  • 我们需要一个例子,但是如果变量存储为日期对象,我不明白为什么你不能将它们强制转换为数字,然后你可以使用时间戳。如果您使用 dput(),您可以更准确地向我们展示问题所在
  • 添加代码sn-p

标签: r string date


【解决方案1】:

您可以将数据转换为数字,不是数字的日期将更改为NA(带有可以安全忽略的警告),然后我们可以使用if_else将它们更改为基于它的日期。

df <- c("01.01.2019", "43867")
df1 <- as.numeric(df)
dplyr::if_else(is.na(df1), as.Date(df, format = "%d.%m.%Y"),
                as.Date(df1, origin = "1899-12-30"))
#[1] "2019-01-01" "2020-02-06"

【讨论】:

    【解决方案2】:

    只需更改类,如 ifelse 帮助页面中所述。无需加载其他包。

    > class(df) <- "Date"
    > df
    [1] "2019-01-01" "2020-02-06"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多