【问题标题】:R dataframe format dates when some are prior to 1/1/1900R 数据框格式日期,有些早于 1900 年 1 月 1 日
【发布时间】:2021-05-28 16:51:08
【问题描述】:

我正在导入带有日期列的 CSV,其中一些日期早于 1900 年 1 月 1 日。我正在尝试在我的数据框中创建一个列,其日期格式为 %m-%d-%Y 类型,但我的努力返回了空单元格。下面是一个例子。感谢您的帮助。

id <- c(1,2,3)
dates <- c(44321, 1, "December 25, 1890")
df <- data.frame(id, dates)
View(df)

df$dates2 <- as.Date(df$dates, format = "%m-%d-%y")
View(df)

期望的输出:

【问题讨论】:

  • 所以有些输入是 1900 年的数字,而其他输入是像您的示例一样写出的全长日期?
  • 如果来源一致,那么as.Date("2021-05-05") - 44321as.Date("1900-01-01") - 1 将相等,但它们不同,因此问题似乎有误。
  • 长格式的44321日期来自Excel;请参阅下面 Limey 对此问题的评论

标签: r date


【解决方案1】:

你所拥有的多种格式让事情有点尴尬,但是......

library(lubridate)

as_date(
  ifelse(
    is.na(as.numeric(dates)), 
    mdy(dates), 
    dmy("01-Jan-1900") + days(as.numeric(dates)-1)
  )
)
[1] "2021-05-06" "1900-01-01" "1890-12-25"

这似乎是合理的。

你确定44321的转换吗? [1900 年和 2000 年都不是闰年...]

as.numeric() 调用是必需的,因为 dates 由于向量中的最终条目而被强制转换为字符。

【讨论】:

  • 谢谢我之前没用过lubridate,我现在就试试。我认为 44321 = 5/5/2021,至少来自 Excel,所以这里的解决方案可能存在问题?
  • 永远不要依赖 Excel!来自this:“Microsoft Excel 从最早的版本开始就错误地将 1900 年视为闰年”,这可以解释这种不一致。
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多