如何使用tidyverse将UTC时区的POSIXct对象转换为指定时区?
按行指定时区转换UTC时间
尝试用tidyverse将UTC时区的POSIXct对象转换为每行tz列指定的时区,但使用with_tz()和force_tz()后,结果均变为本地电脑时区,如何实现按指定时区的正确转换?
示例数据
library(tidyverse) library(lubridate) # 构造示例数据集 aa <- data.frame( siteID = c("A","B","C","D"), datetime_utc = as.POSIXct("2025-06-15 12:00:00", tz = 'UTC'), tz = c( "America/New_York", "America/Chicago", "America/Denver", "America/Anchorage" ) )
问题原因
此前使用rowwise()的写法未正确传递每行的时区参数:with_tz()的tzone参数仅支持单个时区字符串,无法直接接收向量值,必须逐行映射处理,否则会默认使用本地时区。
正确解决方案
方法1:使用purrr::map2(推荐)
通过map2逐个匹配UTC时间与对应时区,完成转换:
bb <- aa |> mutate(datetime = map2(datetime_utc, tz, ~with_tz(.x, tzone = .y))) |> unnest(datetime) # 验证转换结果 bb |> mutate(datetime_with_zone = format(datetime, "%Y-%m-%d %H:%M:%S %Z")) |> select(siteID, datetime_with_zone)
方法2:修正rowwise写法
确保在rowwise环境中,每行的时区值被正确传入with_tz:
bb <- aa |> rowwise() |> mutate(datetime = with_tz(datetime_utc, tzone = tz)) |> ungroup() # 验证转换结果 bb |> mutate(datetime_with_zone = format(datetime, "%Y-%m-%d %H:%M:%S %Z")) |> select(siteID, datetime_with_zone)
预期输出
# A tibble: 4 × 2 siteID datetime_with_zone <chr> <chr> 1 A 2025-06-15 08:00:00 EDT 2 B 2025-06-15 07:00:00 CDT 3 C 2025-06-15 06:00:00 MDT 4 D 2025-06-15 05:00:00 AKDT
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

