如何计算特定年份中R的十进制月份?

时间:2016-08-29 20:29:14

标签: r date

如果我有一个约会,比如说"2014-05-13",我想用小数计算月份,我会这样做:

5 + 13/31 = 5.419355

如何在R中采用日期向量并将其转换为"月小数"向量?

例如:

dates = c("2010-01-24", "2013-04-08", "2014-03-05", "2013-03-08", "2014-02-14", 
          "2004-01-28", "2006-02-21", "2013-03-28", "2013-04-01", "2006-02-14", 
          "2006-01-28", "2014-01-19", "2012-03-12", "2014-01-30", "2005-04-17")

library(lubridate)
month(dates) + day(dates)/31

正如你所看到的那样,放置" 31"作为分隔符,因为天数根据月份而有所不同,有时是年份(闰年)。

那么什么是最好的解决方案?

3 个答案:

答案 0 :(得分:7)

您可以使用Hmisc包中的monthDays功能

> require(Hmisc)
> library(lubridate)
> month(dates) + day(dates)/monthDays(dates)
 [1] 1.774194 4.266667 3.161290 3.258065 2.500000 1.903226 2.750000 3.903226 4.033333
[10] 2.500000 1.903226 1.612903 3.387097 1.967742 4.566667

答案 1 :(得分:6)

使用magrittr,

library(magrittr)
library(lubridate)

dates %>% ymd() %>% { month(.) + day(.) / days_in_month(.) }

##      Jan      Apr      Mar      Mar      Feb      Jan      Feb      Mar      Apr      Feb      Jan 
## 1.774194 4.266667 3.161290 3.258065 2.500000 1.903226 2.750000 3.903226 4.033333 2.500000 1.903226 
##      Jan      Mar      Jan      Apr 
## 1.612903 3.387097 1.967742 4.566667 

由于某种原因,矢量被命名,所以如果你愿意,可以添加%>% unname()

答案 2 :(得分:6)

这是一个基础R hack,它使用我在SO上看到的技巧来获取下个月的第一天,并减去1以返回感兴趣的月份的最后一天。

# format dates to Date class
dates <- as.Date(dates)
# get the next month
nextMonths <- as.integer(substr(dates, 6, 7)) + 1L
# replace next month with 1 if it is equal to 13
nextMonths[nextMonths == 13] <- 1L

# extract the number of days using date formatting (%d), paste, and subtraction
dayCount <- as.integer(format(as.Date(paste(substr(dates, 1, 4),
                                      nextMonths, "01", sep="-"))-1L, format="%d"))

dayCount
[1] 31 30 31 31 28 31 28 31 30 28 31 31 31 31 30

# get month with fraction using date formatting (%m)
as.integer(format(dates, format="%m")) + (as.integer(format(dates, format="%d")) / dayCount)
[1] 1.774194 4.266667 3.161290 3.258065 2.500000 1.903226 2.750000 3.903226 4.033333 2.500000
[11] 1.903226 1.612903 3.387097 1.967742 4.566667