これは明確な答えがないまま何度か尋ねられました。「YYYY-mm-dd」の形式のR文字列をに変換したいと思いDate
ます。as.Date
機能が非常に遅いです 。Rで文字を日付に*すばやく*変換するとfasttime
、1970年以降の日付で機能するソリューションが提供されます。私の問題は、1900年から変換する必要のある日付があり、約1億個あることです。私はこれを頻繁に行わなければならないので、速度が重要です。他に解決策はありますか?
質問する
6649 次
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
少し前に同様の問題があり、次の解決策を思いつきました。
- 文字列を因子に変換します(まだ因子でない場合)
- 因子のレベルを日付に変換します
- 因子のインデックス ベクトルを使用して、変換されたレベルを解に展開します。
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 に答える