如何用lubridate或base包将多时区时间向量转成UTC
问题与解决方案
数据
我有一个包含不同时区时间的向量,示例如下:
x = c("2024-01-05 11:12:13 UTC", "2024-01-10 12:13:14 CET", "2024-01-15 07:08:09 EST")
需求
提取每个元素的时区信息,并将这些时间统一转换为UTC时区,优先使用{base}或{lubridate}包实现。
尝试的错误代码
dtf <- tibble( x <- c("2024-01-05 11:12:13 UTC", "2024-01-10 12:13:14 CET", "2024-01-15 07:08:09 EST") y <- str_extract(x, "[^ ]+$")) dtf %>% map( y, ~ as_datetime(x, tz = y) )
该代码返回NULL,问题在于:
- tibble列定义时误用
<-,且列之间缺少逗号分隔 map使用方式错误,未针对数据框逐行处理时间转换
解决方案
方案1:使用base R
# 提取每个时间字符串的时区部分 timezones <- sub(".* ", "", x) # 逐个解析时间字符串为带时区的POSIXct对象 dt_objects <- mapply( function(dat_str, tz) as.POSIXct(dat_str, tz = tz), x, timezones ) # 转换为UTC时区 dt_utc <- as.POSIXct(dt_objects, tz = "UTC") # 查看结果 dt_utc
输出结果:
[1] "2024-01-05 11:12:13 UTC" "2024-01-10 11:13:14 UTC" "2024-01-15 12:08:09 UTC"
方案2:使用lubridate包
lubridate可以更简洁地处理时区解析和转换:
library(lubridate) # 自动解析带时区的时间字符串 dt_parsed <- parse_date_time(x, orders = "ymd HMS tz") # 提取时区信息 extracted_tz <- tz(dt_parsed) # 转换为UTC时区 dt_utc <- with_tz(dt_parsed, tzone = "UTC") # 查看结果 dt_utc extracted_tz
输出结果:
[1] "2024-01-05 11:12:13 UTC" "2024-01-10 11:13:14 UTC" "2024-01-15 12:08:09 UTC" [1] "UTC" "CET" "EST"
内容的提问来源于stack exchange,提问作者Karol
相关产品推荐
相关产品推荐

