我有一个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
这对于大型数据集很慢。 是否有一个更快的方法? 您的回答,请提供定时,使得他们可以很容易地进行比较。 使用上面的例子。
从使用功能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
这将是最好的,让您的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
它仍然是一个快一点,你会得到后续类似的行动自由,在时间上。
您可以尝试使用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
有可能不是一个单一的项目更快的方法。 但是你可以做一个版本,在集合上操作功能的运行,通过使用内置的重复如不是线性快得多
function mydate(D) {
x <- replicate(dim(D)[0], get_year_month(..)
return(x)
}