簡體   English   中英

R:為日期添加月份的有效方法?

[英]R: efficient ways to add months to dates?

我有一個數百萬行的data.table,其中一列是日期列。 我想在該列的所有日期添加12個月並創建一個新列。 所以我使用dplyr和lubridate包Eg

library(dplyr)
library(lubridate)
new_data <- data %>% mutate(date12m = date %m+% months(12))

這可行,但對於大型數據集來說速度非常慢。 我錯過了什么嗎? 怎么加速呢? 對於這么簡單的任務,我通常不希望R運行超過10分鍾

編輯:

我注意到我的解決方案已經比使用as.yearmon更有效了。 感謝Beauvel上校的解決方案

a <- data.frame(date = rep(today(),1000000))


func = function(u) {
  d = as.Date(as.yearmon(u)+1, frac=1) 
  if(day(u)>day(d)) return(d)
  day(d) = day(u)
  d
} 

pt <- proc.time()
a <- a %>% mutate(date12m = func(date))
data.table::timetaken(pt)


pt <- proc.time()
a <- a %>% mutate(date12m = date %m+% 12)
data.table::timetaken(pt)

只需在month添加1:

x=seq.Date(from=as.Date("2007-01-01"), to=as.Date("2014-12-12"), by="day")
month(x) = month(x) + 1

#> head(x)
#[1] "2007-02-01" "2007-02-02" "2007-02-03" "2007-02-04" "2007-02-05" "2007-02-06"

編輯 :根據@akrun評論這里是解決方案,使用來自zoo包的as.yearmon 訣竅是在下個月的最后一天采取快速檢查:

library(zoo)

func = function(u)
{
    d = as.Date(as.yearmon(u)+1/12, frac=1) 
    if(day(u)>day(d)) return(d)
    day(d) = day(u)
    d
} 

x=as.Date(c("2014-01-31","2015-02-28","2013-03-02"))
#> as.Date(sapply(x, func))
#[1] "2014-02-28" "2015-03-28" "2013-04-02"

我也在使用R中的大數據框,你可以使用包DescTools ,它有一個名為AddMonths(date,NoOfMonths)的函數。

它對我來說效果很好。

> a <- ymd("2011-09-9")
> b <- AddMonths(a,1)
> b

[1] "2011-10-09"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM