lubridate:与时区不一致的行为

ℕʘʘ*_*ḆḽḘ 2 timezone r lubridate dplyr

考虑下面的例子

\n\n
 library(lubridate)\n library(tidyverse)\n\n> hour(ymd_hms(\'2008-01-04 00:00:00\'))\n[1] 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,

\n\n
dataframe <- data_frame(time = c(ymd_hms(\'2008-01-04 00:00:00\'),\n                                 ymd_hms(\'2008-01-04 00:01:00\'),\n                                 ymd_hms(\'2008-01-04 00:02:00\'),\n                                 ymd_hms(\'2008-01-04 00:03:00\')),\n                        value = c(1,2,3,4))\n\nmutate(dataframe,hour = strftime(time, format="%H:%M:%S"),\nhour2 = hour(time)) \n\n# A tibble: 4 \xc3\x97 4\n                 time value     hour hour2\n               <dttm> <dbl>    <chr> <int>\n1 2008-01-03 19:00:00     1 19:00:00    19\n2 2008-01-03 19:01:00     2 19:01:00    19\n3 2008-01-03 19:02:00     3 19:02:00    19\n4 2008-01-03 19:03:00     4 19:03:00    19\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里发生了什么?为什么日期会转换为我不知道的当地时间?

\n

kon*_*vas 5

这不是 lubridate 的问题,而是 POSIXct 值组合成向量的方式的问题。

你有

> ymd_hms('2008-01-04 00:01:00')
[1] "2008-01-04 00:01:00 UTC"
Run Code Online (Sandbox Code Playgroud)

但是当组合成向量时你会得到

> 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"
Run Code Online (Sandbox Code Playgroud)

原因是tzone组合 POSIXct 值时该属性会丢失(请参阅 参考资料c.POSIXct)。

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

$class
[1] "POSIXct" "POSIXt"
Run Code Online (Sandbox Code Playgroud)

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

你可以用什么来代替

> 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"
Run Code Online (Sandbox Code Playgroud)

这将使用默认的tz = "UTC"这将为所有参数

您还需要传入tz = "UTC"strftime因为它的默认值是您当前的时区(与ymd_hms默认值 UTC 不同)。