r-使用as.POSIXct()或lubridate包中的函数处理夏令时



假设我给出了这个向量x。我想把这些转换成"America/Detroit"时区。

x <- c("2018-03-10 23:30:00", "2018-03-11 00:00:00", "2018-03-11 00:30:00", "2018-03-11 01:00:00",
"2018-03-11 01:30:00", "2018-03-11 02:00:00", "2018-03-11 02:30:00",
"2018-03-11 03:00:00",
"2018-03-11 03:30:00", "2018-03-11 04:00:00", "2018-03-11 04:30:00")

如果我如下使用ymd_hms(),由于DST,我得到两个NA

ymd_hms(x, tz = "America/Detroit")
[1] "2018-03-10 23:30:00 EST" "2018-03-11 00:00:00 EST" "2018-03-11 00:30:00 EST"
[4] "2018-03-11 01:00:00 EST" "2018-03-11 01:30:00 EST" NA                       
[7] NA                        "2018-03-11 03:00:00 EDT" "2018-03-11 03:30:00 EDT"
[10] "2018-03-11 04:00:00 EDT" "2018-03-11 04:30:00 EDT"
Warning message:
2 failed to parse. 

是否有一种方法将CCD_ 5格式化为日期时间;2018-03-11 02:00:00";向前滚动一个小时?最终日期时间应如下所示:

c("2018-03-10 23:30:00 EST", "2018-03-11 00:00:00 EST", "2018-03-11 00:30:00 EST", "2018-03-11 01:00:00 EST",
"2018-03-11 01:30:00 EST", "2018-03-11 03:00:00 EDT", "2018-03-11 03:30:00 EDT",
"2018-03-11 04:00:00 EDT", "2018-03-11 04:30:00 EDT", "2018-03-11 05:00:00 EDT", "2018-03-11 05:30:00 EDT")

如果我使用force_tz(),它就不能满足我的要求。

force_tz(ymd_hms(x), tz="America/Detroit", roll = TRUE)
[1] "2018-03-10 23:30:00 EST" "2018-03-11 00:00:00 EST" "2018-03-11 00:30:00 EST"
[4] "2018-03-11 01:00:00 EST" "2018-03-11 01:30:00 EST" "2018-03-11 03:00:00 EDT"
[7] "2018-03-11 03:00:00 EDT" "2018-03-11 03:00:00 EDT" "2018-03-11 03:30:00 EDT"
[10] "2018-03-11 04:00:00 EDT" "2018-03-11 04:30:00 EDT"

您需要知道您的数据是什么时区,根据您的解释和所需的输出,您似乎一直在EST(东部标准时间(中。

还要注意force_tzwith_tz之间的差异

force_tz保持时间不变,但更改时区,这将导致该设置时区的时间不存在。

当你想将时间从一个时间转换为另一个时间时,你会使用with_tz(告诉我这里和其他地方相比有多晚(。

因此,我们取您的EST时区,并将其转换为";美国/底特律";包括EST和EDT时间

解决方案

x <- c("2018-03-10 23:30:00", "2018-03-11 00:00:00", "2018-03-11 00:30:00", "2018-03-11 01:00:00", "2018-03-11 01:30:00", "2018-03-11 02:00:00", "2018-03-11 02:30:00", "2018-03-11 03:00:00", "2018-03-11 03:30:00", "2018-03-11 04:00:00", "2018-03-11 04:30:00")
x <- ymd_hms(x, tz = "EST") # here we tell all dates we have are in EST
with_tz(x, "America/Detroit")
[1] "2018-03-10 23:30:00 EST" "2018-03-11 00:00:00 EST" "2018-03-11 00:30:00 EST" "2018-03-11 01:00:00 EST" "2018-03-11 01:30:00 EST" "2018-03-11 03:00:00 EDT" "2018-03-11 03:30:00 EDT"
[8] "2018-03-11 04:00:00 EDT" "2018-03-11 04:30:00 EDT" "2018-03-11 05:00:00 EDT" "2018-03-11 05:30:00 EDT"

将其与进行比较

force_tz(x, "America/Detroit", roll = T)
[1] "2018-03-10 23:30:00 EST" "2018-03-11 00:00:00 EST" "2018-03-11 00:30:00 EST" "2018-03-11 01:00:00 EST" "2018-03-11 01:30:00 EST" "2018-03-11 03:00:00 EDT" "2018-03-11 03:00:00 EDT"
[8] "2018-03-11 03:00:00 EDT" "2018-03-11 03:30:00 EDT" "2018-03-11 04:00:00 EDT" "2018-03-11 04:30:00 EDT"

相关内容

  • 没有找到相关文章

最新更新