gpt4 book ai didi

r - lubridate with_tz 不与 dplyr group_by 一起工作

转载 作者:行者123 更新时间:2023-12-04 00:25:42 27 4
gpt4 key购买 nike

我正在尝试将一系列 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com