如何用lubridate将带时区的日期时间字符串转为带tzone属性的POSIXct/POSIXt
使用lubridate转换带时区的字符型日期时间并保留时区属性的方法
不需要手动截取字符串中的时区信息,lubridate提供了现成的解析函数可以直接处理带时区的字符型日期时间,自动识别时区并设置到tzone属性中。
核心方法:直接使用ymd_hms()解析带时区的字符串
针对你给出的示例,直接将带时区的字符串传入ymd_hms()即可完成转换,无需手动指定tz参数:
library(lubridate) my_time_string <- "2023-02-01 19:16:24 UTC" my_time_dttm <- ymd_hms(my_time_string) # 查看类型 class(my_time_dttm) #> [1] "POSIXct" "POSIXt" # 查看属性,tzone已自动设置为UTC attributes(my_time_dttm) #> $class #> [1] "POSIXct" "POSIXt" #> #> $tzone #> [1] "UTC"
其他场景:支持多种时区标识
除了UTC,lubridate还能识别常见的时区缩写(如EST、CET)或IANA标准时区名(如"America/New_York"),示例如下:
# 带EST时区的字符串 est_time_string <- "2023-02-01 19:16:24 EST" est_time_dttm <- ymd_hms(est_time_string) attributes(est_time_dttm)$tzone #> [1] "EST" # 带IANA时区名的字符串 ny_time_string <- "2023-02-01 19:16:24 America/New_York" ny_time_dttm <- ymd_hms(ny_time_string) attributes(ny_time_dttm)$tzone #> [1] "America/New_York"
通用解析函数:parse_date_time()
如果你的日期时间格式不是标准的年-月-日 时:分:秒格式,可以使用更通用的parse_date_time(),通过指定格式模板让函数识别时区:
custom_format_string <- "01/02/2023 19:16:24 UTC" custom_time_dttm <- parse_date_time(custom_format_string, orders = "dmy HMS z") attributes(custom_time_dttm)$tzone #> [1] "UTC"
总结:不需要手动截取时区,lubridate的解析函数可以自动识别字符串中的时区信息并设置到tzone属性,直接传入带时区的字符串即可完成转换。
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

