2012-01-11 9 views
3

私は同様のことが議論されていることを知っていますが、私はまだ答えが見つかりませんでした。日時変換R

1:POSIXct

に日
> Sys.timezone() 
[1] "EST" 

> as.POSIXct("2011-01-30") 
[1] "2011-01-30 EST" 

> as.POSIXct(as.Date("2011-01-30")) 
[1] "2011-01-29 19:00:00 EST" 

> as.POSIXct(as.Date("2011-01-30"), tz="EST") 
[1] "2011-01-29 19:00:00 EST" 

> as.POSIXct(as.Date("2011-01-30"), tz="GMT") 
[1] "2011-01-29 19:00:00 EST" 

> as.POSIXct(as.Date("2011-01-30"), tz="America/New_York") 
[1] "2011-01-29 19:00:00 EST" 

> as.POSIXct(as.Date("2011-01-30"), tz="") 
[1] "2011-01-29 19:00:00 EST" 

誰が入力日付であれば、なぜ、私は私が正しいタイムゾーンを指定したにも関わらず深夜1月30日を取得することはできません教えてもらえますか?一方、入力が文字列の場合はOKです。

2:日付/文字変換。

どちらも非常に遅いです。それから私は、最初POSIXltに変換することにより、それが実際にははるかに高速の日付に文字列を変換することを発見した:

> d3.str = "2011-03-02 23:59:00"; 
> N=10000 
> system.time(for(i in 1:N) r5.dt = as.Date(d3.str)) 
    user system elapsed 
    1.25 0.00 1.24 
> system.time(for(i in 1:N) r6.dt = as.Date(strptime(d3.str, format="%Y-%m-%d"))) 
    user system elapsed 
    0.37 0.00 0.38 
> r5.dt 
[1] "2011-03-02" 
> r5.dt==r6.dt 
[1] TRUE 

私は今、混乱しています。文字を日付に変換する、より高速で洗練された方法はありますか?そして、文字の代わりに日付を使用してください。これはかなり遅いです。

ありがとうございます!

+0

ヘイ・ギャビン編集のおかげで!今はもっと良く見えます。 – sunt

答えて

4

2番目の質問では、as.Date.characteras.Date.POSIXltのコードを比較すると、多分もっと明確になるでしょう。あなたがフォーマットを指定していないので、それらのうちの1人は、より多くのものをチェックしなければなりません。

通常の速度では、コンバージョンをベクトル化していません。 as.Dateおよびstrptimeなどほとんどの日付/時刻変換関数では、の日付と日付時刻を受け入れます。それは道よりかなり速いでしょう。

+0

年のターンに閏秒が追加され、DSTの変更が1月に発生したことがないため、最後の文章を破棄する必要があります。 –

+0

私はちょうどas.character.Date、as.POSIXlt.POSIXctなどのような同様の機能を理解しており、一般的に形式を指定することで処理速度が向上します。私の状況では、私はループを使用する必要があります。これはすばらしいものです。みなさん、お手伝いをしてくれてありがとう! – sunt

2

as.POSIXctの引数は文字列でのみ使用され、それ以外の場合(黙って)無視されます。 lubridateパッケージのwith_tz機能など、日付の操作に役立つように設計されたパッケージをご覧ください。

7

as.POSIXctヘルプページの早い段階で、「時間のない日付はUTCの深夜に扱われます。」 'tz'引数でこれを修正するというあなたの期待は間違いです。

strftime(as.POSIXct(as.Date("2011-01-30")), format="%Y-%m-%d %H:%M:%S", tz="UCT") 
#[1] "2011-01-30 00:00:00" 

をあなたは本当にただ、あなたがas.Dateを使用すべき日付をしたい場合:UCTであることを出力を指定する場合は、元の日付を取得することができます。

+1

+1 - あなたのタイムゾーンで真夜中が必要な場合は、 'ISODatetime(2012,1,11,0,0,0)'(または他の日付)を使用してください。 –

+0

ありがとう。 'srtftime'が '文字'の結果を生成し、' ISOdatetime'( "d"は上限がないことに注意してください)はクラス 'POSIXct'を返しますので、もっと望ましいかもしれません。 –