You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:43:14