lubridate的向量化时区转换

ren*_*nsa 5 datetime r date lubridate tidyverse

我有一个带有日期时间字符串列的数据框:

library(tidyverse)
library(lubridate)

testdf = data_frame(
  mytz = c('Australia/Sydney', 'Australia/Adelaide', 'Australia/Perth'),
  mydt = c('2018-01-17T09:15:00', '2018-01-17T09:16:00', '2018-01-17T09:18:00'))

testdf

#  A tibble: 3 x 2
#   mytz               mydt
#   <chr>              <chr>
# 1 Australia/Sydney   2018-01-17T09:15:00
# 2 Australia/Adelaide 2018-01-17T09:16:00
# 3 Australia/Perth    2018-01-17T09:18:00
Run Code Online (Sandbox Code Playgroud)

我想将这些日期时间字符串转换为具有各自时区的POSIX日期时间对象:

testdf %>% mutate(mydt_new = ymd_hms(mydt, tz = mytz))
Run Code Online (Sandbox Code Playgroud)

mutate_impl(.data,点)中的错误:评估错误:tz参数必须是单个字符串。另外:警告消息:如果if(tz!=“ UTC”){:条件的长度> 1,并且仅使用第一个元素

如果使用ymd_hms不带时区的内容并将其传送到,我将得到相同的结果force_tz。得出结论,就时区操作而言,lubridate不支持任何形式的矢量化是否公平?

akr*_*run 5

另一种选择是map2。将不同的tz输出存储在 a 中可能会更好,list因为这可能会被强制转换为单个tz

library(tidyverse)
out <- testdf %>%
         mutate(mydt_new = map2(mydt, mytz, ~ymd_hms(.x, tz = .y)))
Run Code Online (Sandbox Code Playgroud)

如果需要,可以unnest编辑

out %>%
   unnest
Run Code Online (Sandbox Code Playgroud)

中的值list

out %>%
   pull(mydt_new)
#[[1]]
#[1] "2018-01-17 09:15:00 AEDT"

#[[2]]
#[1] "2018-01-17 09:16:00 ACDT"

#[[3]]
#[1] "2018-01-17 09:18:00 AWST"
Run Code Online (Sandbox Code Playgroud)

  • @akrun 我认为你是我声誉的主要贡献者。非常感激。:) (2认同)