5

私はを持っており、それを形式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 

これは、大きなデータセットの場合は非常に遅くなります。より速い方法はありますか?簡単に比較できるように、回答のタイミングを教えてください。上記の例を使用してください。

4

4 に答える 4

5

パッケージの関数を使用すると、関数のlubridateほぼ2倍の速度になります。

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
于 2013-03-09T22:42:02.600 に答える
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
于 2013-03-10T11:52:46.450 に答える
2

次のように日付を操作する場合は、日付を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 

それでも少し高速で、時間の観点から、その後の同様の操作を無料で利用できます。

于 2013-03-09T23:03:18.123 に答える
0

単一のアイテムに対してより速い方法はないかもしれません。ただし、組み込みのレプリケートを使用することで、コレクションを操作する関数のバージョンを線形よりもはるかに高速に実行できます。

function mydate(D) {
  x <- replicate(dim(D)[0], get_year_month(..)
  return(x)
}
于 2013-03-09T22:48:52.307 に答える