转换日期中的R年月表示(convert date to year month representat

2019-07-21 06:48发布

我有一个Date ,并有兴趣在代表它作为一个整数yyyymm形式。 目前,我做的:

get_year_month <- function(d) { return(as.integer(format(d, "%Y%m")))}
mydate = seq.Date(from=as.Date("2012-01-01"), to=as.Date("5012-01-01"), by=1) 
system.time(ym <- get_year_month(mydate))
#    user  system elapsed 
#    5.972   0.974   6.951 

这对于大型数据集很慢。 是否有一个更快的方法? 您的回答,请提供定时,使得他们可以很容易地进行比较。 使用上面的例子。

Answer 1:

从使用功能lubridate包可以几乎快两倍,你的函数:

mydate = as.Date(rep("2012-01-01",1000))
library(lubridate)
library(microbenchmark)
microbenchmark(get_year_month(mydate),
               year(mydate)*100+month(mydate))

得到:

R> Unit: milliseconds
                               expr      min       lq   median       uq
             get_year_month(mydate) 2.150296 2.188370 2.218176 2.285973
 year(mydate) * 100 + month(mydate) 1.220016 1.228129 1.239704 1.284568


Answer 2:

这将是最好的,让您的2012年新POSIXlt格式,如果你想操纵他们这样的:

> system.time(ym <- get_year_month(mydate))
   user  system elapsed 
  4.039   0.025   4.079 
> system.time(mydatep <- as.POSIXlt(mydate))
   user  system elapsed 
  3.576   0.016   3.603 
> system.time(ym <- (1900 + mydatep$year)*100 + (mydatep$mon + 1))
   user  system elapsed 
  0.010   0.005   0.015 

它仍然是一个快一点,你会得到后续类似的行动自由,在时间上。



Answer 3:

您可以尝试使用yearmon从类zoo包。 一般来说,如果你正在做的时间序列数据处理和分析,我建议使用xts或至少zoo类。 xts有很多的功能非常巨大的时间序列数据的分析。

这是对其他建议的解决方案快基准。

get_year_month <- function(d) {
    return(as.integer(format(d, "%Y%m")))
}
mydate = as.Date(rep("2012-01-01", 1e+06))

microbenchmark(get_year_month(mydate), year(mydate) * 100 + month(mydate), as.yearmon(mydate, format = "%Y-%m-%d"), times = 1)
## Unit: milliseconds
##                                     expr       min        lq    median        uq       max neval
##                   get_year_month(mydate) 1049.8813 1049.8813 1049.8813 1049.8813 1049.8813     1
##       year(mydate) * 100 + month(mydate)  434.1765  434.1765  434.1765  434.1765  434.1765     1
##  as.yearmon(mydate, format = "%Y-%m-%d")  249.6704  249.6704  249.6704  249.6704  249.6704     1


Answer 4:

有可能不是一个单一的项目更快的方法。 但是你可以做一个版本,在集合上操作功能的运行,通过使用内置的重复如不是线性快得多

function mydate(D) {
  x <- replicate(dim(D)[0], get_year_month(..)
  return(x)
}


文章来源: convert date to year month representation in R