我有一个数字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-2011
和date_system
),但它也无济于事
excel版本是2010
答案 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
也许日期和年份字段在数据中上游切换到这些映射到整数日期的位置,由于选择了值,因此很难说明这一点。