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

Date objects in decimals spanning multiple leap years

我想找出一种方法将一天转换为小数,其中 0 是 1 月 1 日,12 月 31 日是 1。这里没有时间,只有几天。我寻找了一些解决方案,例如 here and here,但这些解决方案似乎都不适合我的问题。我也对 lubridate 中的 date_decimal 函数抱有希望。我想出了一个解决方案,涉及将 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))

A dplyr 管道生成 daydecimal:

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

但正如我所说,这很笨拙并且涉及到第二个数据帧,这从来都不是理想的。关于如何将一些日期转换为小数有什么建议吗?

您可以使用 decimal_date()

而不是 date_decimal()
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