2017-02-08 10 views
1

と矛盾する行動はここで何が起こっているか今lubridate:タイムゾーン

library(lubridate) 
library(tidyverse) 

> hour(ymd_hms('2008-01-04 00:00:00')) 
[1] 0 

dataframe <- data_frame(time = c(ymd_hms('2008-01-04 00:00:00'), 
           ymd_hms('2008-01-04 00:01:00'), 
           ymd_hms('2008-01-04 00:02:00'), 
           ymd_hms('2008-01-04 00:03:00')), 
         value = c(1,2,3,4)) 

mutate(dataframe,hour = strftime(time, format="%H:%M:%S"), 
hour2 = hour(time)) 

# A tibble: 4 × 4 
       time value  hour hour2 
       <dttm> <dbl> <chr> <int> 
1 2008-01-03 19:00:00  1 19:00:00 19 
2 2008-01-03 19:01:00  2 19:01:00 19 
3 2008-01-03 19:02:00  3 19:02:00 19 
4 2008-01-03 19:03:00  4 19:03:00 19 

次の例を考えてみましょうか?なぜ私はイベントを知っていないいくつかの現地時間に変換されているのですか?

+1

はい、 'strftime'はあなたの現在のタイムゾーンを使用します。代わりに 'strftime(time、format ="%H:%M:%S "、tz =" UTC ")'を使用してください。 – konvas

+0

ありがとうが、謎のまま残っているのはなぜ 'lubridate:hour'がローカルタイムゾーンを使用するのかということです。最初の例では' –

答えて

2

これはlubridateの問題ではありませんが、POSIXct値がベクトルに結合される方法では問題ありません。

あなたは

> ymd_hms('2008-01-04 00:01:00') 
[1] "2008-01-04 00:01:00 UTC" 

を持っている。しかし、あなたが

> c(ymd_hms('2008-01-04 00:01:00'), ymd_hms('2008-01-04 00:01:00')) 
[1] "2008-01-03 19:01:00 EST" "2008-01-03 19:01:00 EST" 

を取得するベクターに結合するときの理由はPOSIXct値を(c.POSIXctを参照)を組み合わせたときにtzone属性が失われるということです。

> attributes(ymd_hms('2008-01-04 00:01:00')) 
$tzone 
[1] "UTC" 

$class 
[1] "POSIXct" "POSIXt" 

いますが、代わりに使用することができますどのような

> attributes(c(ymd_hms('2008-01-04 00:01:00'))) 
$class 
[1] "POSIXct" "POSIXt" 

は、すべての引数にデフォルト tz = "UTC"を使用します

> ymd_hms(c('2008-01-04 00:01:00', '2008-01-04 00:01:00')) 
[1] "2008-01-04 00:01:00 UTC" "2008-01-04 00:01:00 UTC" 

です。

tz = "UTC"strftimeに渡す必要があります(デフォルトは現在のタイムゾーンであるymd_hmsとは異なり、デフォルトはUTCです)。

関連する問題