11

これは明確な答えがないまま何度か尋ねられました。「YYYY-mm-dd」の形式のR文字列をに変換したいと思いDateます。as.Date機能が非常に遅いです 。Rで文字を日付に*すばやく*変換するとfasttime、1970年以降の日付で機能するソリューションが提供されます。私の問題は、1900年から変換する必要のある日付があり、約1億個あることです。私はこれを頻繁に行わなければならないので、速度が重要です。他に解決策はありますか?

4

5 に答える 5

10

dateパッケージを使用すると、少し高速化できます。

library(date)
set.seed(21)
x <- as.character(Sys.Date()-sample(40000, 1e6, TRUE))
system.time(dDate <- as.Date(x))
#    user  system elapsed 
#    6.54    0.01    6.56 
system.time(ddate <- as.Date(as.date(x,"ymd")))
#    user  system elapsed 
#    3.42    0.22    3.64 

使用する C コードを調べて、特定の状況でより高速になるように変更できるかどうかを確認することをお勧めします。

于 2013-01-08T15:49:58.653 に答える
10

少し前に同様の問題があり、次の解決策を思いつきました。

  1. 文字列を因子に変換します(まだ因子でない場合)
  2. 因子のレベルを日付に変換します
  3. 因子のインデックス ベクトルを使用して、変換されたレベルを解に展開します。

Joshua Ulrichの例を拡張すると、(ラップトップのタイミングが遅くなります)

library(date)
set.seed(21)
x <- as.character(Sys.Date()-sample(40000, 1e6, TRUE))
system.time(dDate <- as.Date(x))
#    user  system elapsed 
#    12.09   0.00   12.12 
system.time(ddate <- as.Date(as.date(x,"ymd")))
#    user  system elapsed 
#    6.97    0.04    7.05 
system.time({
    xf <- as.factor(x)
    dDate <- as.Date(levels(xf))[as.integer(xf)]
})
#    user  system elapsed 
#    1.16    0.00    1.15

ここで、ステップ 2 は、x が十分に大きく、ステップ 3 が非常に適切にスケーリングされると (単純なベクトル インデックス付け)、x の長さに依存しません。ボトルネックはステップ 1 である必要があります。これは、データが因子として既に保存されている場合は回避できます。

于 2013-03-08T09:40:38.187 に答える