将Excel数字转换为日期

时间:2017-11-03 10:14:16

标签: r excel date zoo janitor

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

<?php $url = $_SERVER['REQUEST_URI']; $dbhost = "dummyhost"; $dbuser = "dummyuser"; $dbpass = ""; $dbname = "dummy"; $conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); if(!$conn){ die("ERROR"); } $index = mysqli_query($conn, "SELECT FROM pages WHERE page LIKE '".$url."%'); $indexRow = mysqli_fetch_assoc($index); $indexHeader = $indexRow['header']; $indexContent = $indexRow['content']; $indexFooter = $indexRow['footer']; $indexfeature = $indexRow['feature'];

使用date <- c(42963,42994,42903,42933,42964)软件包中的excel_to_numeric_date函数和janitor软件包中的as.yearmon函数

时,期望的输出

zoo

但是,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"中的modern参数使用不同的选项(mac pre-2011date_system),但它也无济于事

excel版本是2010

3 个答案:

答案 0 :(得分:7)

您可以简单地使用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提供了有关此事的大量信息。

答案 1 :(得分:1)

如果要从Excel转换日期,可以将as.Date()与特定origin一起使用。根据文档,'1900-01-01'在Excel中用作日`。

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

这是as.Date()

的结果
as.Date(date, origin = "1900-01-01")
[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 = "1900-01-01"))
[1] "Aug 2017" "Sep 2017" "Jun 2017" "Jul 2017" "Aug 2017"

答案 2 :(得分:1)

键入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

也许日期和年份字段在数据中上游切换到这些映射到整数日期的位置,由于选择了值,因此很难说明这一点。