作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将一系列 UTC 时间转换为给定时区向量的本地时间。
test = tibble(time = c(as_datetime('2019-01-01 00:00:00'),
as_datetime('2019-01-01 01:00:00'),
as_datetime('2019-01-01 00:00:00'),
as_datetime('2019-01-01 01:00:00')),
tz = c('EST','EST','Asia/Hong_Kong','Asia/Hong_Kong'))
我似乎无法让 with_tz 识别时区变量。没有任何转换。
test %>% group_by(tz) %>% mutate(localtime = with_tz(time, tz[1]))
time tz localtime
<dttm> <chr> <dttm>
1 2019-01-01 00:00:00 EST 2019-01-01 00:00:00
2 2019-01-01 01:00:00 EST 2019-01-01 01:00:00
3 2019-01-01 00:00:00 Asia/Hong_Kong 2019-01-01 00:00:00
4 2019-01-01 01:00:00 Asia/Hong_Kong 2019-01-01 01:00:00
我尝试先对 tz[1] 求值,但组被忽略了。 (可能如预期的那样)
test %>% group_by(tz) %>% mutate(localtime = with_tz(time, !!tz[1]))
time tz localtime
<dttm> <chr> <dttm>
1 2019-01-01 00:00:00 EST 2018-12-31 19:00:00
2 2019-01-01 01:00:00 EST 2018-12-31 20:00:00
3 2019-01-01 00:00:00 Asia/Hong_Kong 2018-12-31 19:00:00
4 2019-01-01 01:00:00 Asia/Hong_Kong 2018-12-31 20:00:00
我试过 rowwise 但它对所有时区都使用“Asia/Hong_Kong”。 (没想到这个)
test %>% rowwise %>% mutate(localtime = with_tz(time, tz))
time tz localtime
<dttm> <chr> <dttm>
1 2019-01-01 00:00:00 EST 2019-01-01 08:00:00
2 2019-01-01 01:00:00 EST 2019-01-01 09:00:00
3 2019-01-01 00:00:00 Asia/Hong_Kong 2019-01-01 08:00:00
4 2019-01-01 01:00:00 Asia/Hong_Kong 2019-01-01 09:00:00
谁能解释一下这是怎么回事?
最佳答案
列是一个原子向量,即元素具有相同的类型和相同的属性,因此您不能为每个元素单独设置时区。但是,您可以将具有不同属性的异构元素放入列表中。例如,您可以这样做:
library(tidyverse)
library(lubridate)
test_nested <- test %>%
mutate(tz_group = tz) %>%
nest(-tz_group, .key = tz_times) %>%
mutate(tz_times = map(tz_times,
~ mutate(., localtime = with_tz(time, tz[1]))
)
)
它返回一个带有列表列的数据框,其中每个元素都包含具有不同时区的时间:
test_nested
# A tibble: 2 x 2
tz_group tz_times
<chr> <list>
1 EST <tibble [3]>
2 Asia/Hong_Kong <tibble [3]>
明显的缺点是值是隐藏的,但您可以通过拉
列表列使它们可见:
test_nested %>% pull(tz_times)
哪个返回:
[[1]]
# A tibble: 2 x 3
time tz localtime
<dttm> <chr> <dttm>
1 2019-01-01 00:00:00 EST 2018-12-31 19:00:00
2 2019-01-01 01:00:00 EST 2018-12-31 20:00:00
[[2]]
# A tibble: 2 x 3
time tz localtime
<dttm> <chr> <dttm>
1 2019-01-01 00:00:00 Asia/Hong_Kong 2019-01-01 08:00:00
2 2019-01-01 01:00:00 Asia/Hong_Kong 2019-01-01 09:00:00
或者,您可以展开
列表列元素以分隔列并取消嵌套
:
test_nested %>%
spread(tz_group, tz_times) %>%
unnest() %>%
select(-starts_with("time"))
它返回一个宽数据框,在日期时间旁边带有时区标签:
# A tibble: 2 x 4
tz localtime tz1 localtime1
<chr> <dttm> <chr> <dttm>
1 Asia/Hong_Kong 2019-01-01 08:00:00 EST 2018-12-31 19:00:00
2 Asia/Hong_Kong 2019-01-01 09:00:00 EST 2018-12-31 20:00:00
关于r - lubridate with_tz 不与 dplyr group_by 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133105/
我正在尝试将一系列 UTC 时间转换为给定时区向量的本地时间。 test = tibble(time = c(as_datetime('2019-01-01 00:00:00'),
我是一名优秀的程序员,十分优秀!