在R中解析模糊时间戳:如何指定CDT而非默认的CST?
在R中处理模糊时区时间(指定CDT而非CST)
当在R中执行以下代码时,返回结果默认是CST时区,但我们需要得到CDT时区的对应时间:
> as.POSIXct('2021-11-07 01:30', tz='US/Central') [1] "2021-11-07 01:30:00 CST"
类似Python pandas中通过ambiguous参数指定模糊时间的处理逻辑:
In [5]: pd.Timestamp('2021-11-07 01:30:00').tz_localize('US/Central', ambiguous=False) Out[5]: Timestamp('2021-11-07 01:30:00-0600', tz='US/Central') In [6]: pd.Timestamp('2021-11-07 01:30:00').tz_localize('US/Central', ambiguous=True) Out[6]: Timestamp('2021-11-07 01:30:00-0500', tz='US/Central')
在R中可以通过以下两种方式实现需求:
方法1:使用lubridate包的force_tz函数(推荐)
lubridate的force_tz函数支持ambiguous参数,逻辑与pandas一致:ambiguous=TRUE选择夏令时(CDT)版本,FALSE选择标准时间(CST)版本。
library(lubridate) # 定义目标时间字符串 time_str <- '2021-11-07 01:30' # 先转换为无时区的 naive 时间 naive_time <- as.POSIXct(time_str, tz = "UTC") # 强制指定为US/Central时区的夏令时版本 cdt_time <- force_tz(naive_time, tzone = "US/Central", ambiguous = TRUE) # 查看结果 cdt_time # 输出:[1] "2021-11-07 01:30:00 CDT"
方法2:手动计算UTC时间再转换
如果不想依赖第三方包,可以先计算该时间对应的UTC时间,再转换回US/Central时区:
# 2021-11-07 01:30 CDT 对应UTC时间为2021-11-07 06:30 utc_time <- as.POSIXct('2021-11-07 06:30', tz = "UTC") # 将UTC时间转换为US/Central时区 cdt_time <- as.POSIXct(utc_time, tz = "US/Central") # 查看结果 cdt_time # 输出:[1] "2021-11-07 01:30:00 CDT"
补充说明
R原生的as.POSIXct在处理夏令时切换的模糊时间时,默认会选择标准时间(CST)版本,这是因为时钟回拨后该时间点会出现两次,R默认取第二次的标准时间。通过lubridate::force_tz可以明确指定选择夏令时的版本,更灵活处理这类场景。
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

