2017-02-08 45 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'現在使用當地時區,而第一個示例顯示它正確提取小時爲'0' –

回答

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" 

的原因是tzone屬性被合併POSIXct值時(見c.POSIXct)丟失。

> 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" 

您可以用什麼來代替是

> 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"所有參數。

您還需要將tz = "UTC"轉換爲strftime,因爲它的默認值是您當前的時區(與默認爲UTC的ymd_hms不同)。