2016-08-29 3 views
2

Если у меня есть дата, скажем "2014-05-13", и я хочу, чтобы вычислить месяц в десятичной системе счисления, я хотел бы сделать это:Как рассчитать десятичный месяц в R в конкретном году?

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» в качестве diviser, так как число дней различаются в зависимости от месяца, а иногда и год (високосный год).

Так что было бы лучшим решением?

ответ

7

Вы можете использовать функцию monthDays из Hmisc пакета

> 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 
5

С 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() если вам нравится.

6

Вот базовый R-хак, который использует трюк, который я видел на 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 
+1

Yay, дополнительное приветствие для базового решения R. –

Смежные вопросы