跨越多个闰年的小数日期对象

时间:2016-02-18 22:42:04

标签: r lubridate

我想找出一种方法将一天转换为小数,其中0表示1月1日,12月31日表示1.这里只有几天。我找了一些像herehere这样的解决方案,但这些解决方案似乎都不适合我的问题。我也对date_decimal中的lubridate函数抱有希望。我已经找到了一个解决方案,它涉及将Date转换为数字,合并一个占据数年的数据帧,然后将数字除以一年中的总天数。

library(lubridate)
library(dplyr)

 df <- data.frame(Date=seq(as.Date("2003/2/10"), as.Date("2007/2/10"), "years"),
       var=seq(1,5, by=1))

lubridate功能尝试:

 date_decimal(df$Date)

闰年数据框

 maxdaydf<-data.frame(Year=seq(2003,2007,by=1),   maxdays=c(365,366,365,365,365))

dplyr管道,用于生成daydecimal

df %>%
  mutate(Year=year(Date), daynum=yday(Date)) %>%
  full_join(maxdaydf, by=c("Year")) %>%
  mutate(daydecimal=daynum/maxdays)

但正如我所说,这是笨重的,涉及第二个数据帧,这是绝对不理想的。关于如何将某些日期转换为小数的任何建议?

1 个答案:

答案 0 :(得分:2)

而不是date_decimal(),您可以使用decimal_date()

decimal_date(df$Date)
[1] 2003.110 2004.109 2005.110 2006.110 2007.110

或者您可以使用:

yday(df$Date)/yday(ISOdate(year(df$Date), 12,31))
[1] 0.1123288 0.1120219 0.1123288 0.1123288 0.1123288
相关问题