将Excel数值转换为date

我有一个向量的数值Exceldateie

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

当我使用janitor包中的as.yearmon函数和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"

我已经尝试在date_system中使用excel_numeric_to_date参数的不同选项( modernmac pre-2011 ),但它也不帮助

excel版本是2010年

你可以简单地使用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" 

这个链接提供了相当多的关于这个问题的信息。

如果要从Excel中转​​换date,可以使用具有特定origin as.Date() 。 根据文档, '1900-01-01' ”在Excel中用作date。

 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" 

excel_numeric_to_date来查看函数的代码,你会发现它是这个问题的其他答案使用的代码行的包装: as.Date(date_num, origin = "1899-12-30"

所以这不是问题。

这里的基本问题是关于date格式的混淆。 你说你期望你的第一个数字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 

也许date和年份字段在数据的上游切换到整数date的位置,因为select的值很难在这里告诉。