【问题标题】:Convert Excel numeric to date将 Excel 数字转换为日期
【发布时间】:2018-04-16 00:51:11
【问题描述】:

我有一个数字 excel 日期的向量,即

date <- c(42963,42994,42903,42933,42964)

当使用来自janitor 包的excel_numeric_to_date 函数和来自zoo 包的as.yearmon 函数时,我期待的输出

as.yearmon(excel_numeric_to_date(date)) [1] "Aug 2016" "Sep 2016" "Jun 2017" "Jul 2017" "Aug 2017".

但是,date 向量的第一个元素的转换不正确。 实际结果是:

as.yearmon(excel_numeric_to_date(date)) [1] "Aug 2017" "Sep 2017" "Jun 2017" "Jul 2017" "Aug 2017"

我尝试在 excel_numeric_to_date 中为 date_system 参数使用不同的选项(modernmac pre-2011),但它也无济于事

excel版本是2010

【问题讨论】:

  • 你从哪里得到这些数字的?为什么一开始没有将它们作为 dates 加载?在任何情况下,Excel 都使用 OLE 自动化存储格式来存储日期,这就是此类值称为 OA 日期的原因。整数是日期偏移量。小数部分是当天的一个实例。
  • 最好的解决方案是修改读取这些值的代码,首先将它们读取为日期。你用什么包来加载它们?你是怎么做到的?

标签: r excel date zoo janitor


【解决方案1】:

您可以简单地使用as.Date 并指定来源,即

as.Date(date, origin="1899-12-30") 
#[1] "2017-08-16" "2017-09-16" "2017-06-17" "2017-07-17" "2017-08-17"

#or format it to your liking,

format(as.Date(date, origin="1899-12-30"), '%b %Y') 
#[1] "Aug 2017" "Sep 2017" "Jun 2017" "Jul 2017" "Aug 2017"

这个link 提供了很多关于这个问题的信息。

【讨论】:

  • 请注意,help("as.Date") 包含有关 Excel 日期来源的相关信息。
  • @ Panagiotis Kanavos,问题表明输入是日期,无论如何它似乎确实有效,即使有时间。这些在 Excel 中用一天的一小部分表示,并使用中午作为测试数据,as.yearmon(as.Date(date + 0.5, origin = "1899-12-31")),它给出了正确的答案。
  • 另请参阅 R News 4/1 第 30 页的“其他应用程序”部分 -- r-project.org/doc/Rnews/Rnews_2004-1.pdf 了解有关 Excel 和日期的信息。
  • 嗨。你怎么知道origin 的值是多少?因为有时我使用origin="1899-12-30" 和其他人origin="1582-10-14"。谢谢
【解决方案2】:

如果要从 Excel 转换日期,可以使用 as.Date() 和特定的 origin。根据文档,"1900-01-0"' 在 Windows 上的 Excel 中用作日,但 "this is complicated by Excel incorrectly treating 1900 as a leap year"。所以"1899-12-30" 应该用于 1901 年以后的日期:

date <- c(42963,42994,42903,42933,42964)

这是as.Date()的结果:

as.Date(date, origin = "1899-12-30")
[1] "2017-08-18" "2017-09-18" "2017-06-19" "2017-07-19" "2017-08-19"

然后您可以使用 zoo::as.yearmon()` 来获得预期的结果:

zoo::as.yearmon(as.Date(date, origin = "1899-12-30"))
[1] "Aug 2017" "Sep 2017" "Jun 2017" "Jul 2017" "Aug 2017"

【讨论】:

  • 你必须使用 "1899-12-30" 否则你最终会多两天(左右),例如 4299 在 Excel 中是 2017-15-09 但 origin="1900- 01-01" 你得到 2017-09-17 (请参阅上面来自 Sotos 的答案)
  • 请编辑您对上述评论的回答。我花了 20 分钟试图弄清楚为什么我错过了 2 个日期
【解决方案3】:

键入 excel_numeric_to_date 以查看函数的代码,您会看到它是该问题的其他答案所使用的代码行的包装器:as.Date(date_num, origin = "1899-12-30")

所以这不是问题。

这里的根本问题是对日期格式的混淆。你说你希望你的第一个号码42963 变成"Aug 2016",你的最后一个号码42964 变成"Aug 2017"。后者仅比前者多一个,这显示在转换中 - 它们应该相隔一天,而不是您所期望的相隔一年:

> excel_numeric_to_date(c(42963, 42964))
[1] "2017-08-16" "2017-08-17" # as expected, they are one day apart

也许日期和年份字段在您的数据的上游切换到这些被映射到整数日期的点,并且由于选择的值在这里很难分辨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多