使用 R 中的 POSIXct 处理切换到夏令时
Handling of switch to daylight saving time with POSIXct in R
我有与以下格式的时间戳关联的每小时数据。
xx <- c("2019-03-30 12:00", "2019-03-30 13:00", "2019-03-30 14:00", "2019-03-30 15:00", "2019-03-30 16:00", "2019-03-30 17:00", "2019-03-30 18:00", "2019-03-30 19:00", "2019-03-30 20:00", "2019-03-30 21:00", "2019-03-30 22:00", "2019-03-30 23:00", "2019-03-31 00:00", "2019-03-31 01:00", "2019-03-31 02:00","2019-03-31 03:00", "2019-03-31 04:00", "2019-03-31 05:00", "2019-03-31 06:00", "2019-03-31 07:00", "2019-03-31 08:00", "2019-03-31 09:00", "2019-03-31 10:00", "2019-03-31 11:00", "2019-03-31 12:00")
如果我将其转换为 POSIXct,我会得到一种去掉了小时数的格式:
> as.POSIXct(xx)
[1] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[4] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[7] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[10] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[13] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[16] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[19] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[22] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[25] "2019-03-31 CET"
但我需要保留每小时的时间戳。但是,如果我使用正确的格式选项执行 as.POSIXct(),我会遇到以下问题:
> as.POSIXct(xx, format = "%Y-%m-%d %H:%M")
[1] "2019-03-30 12:00:00 CET" "2019-03-30 13:00:00 CET"
[3] "2019-03-30 14:00:00 CET" "2019-03-30 15:00:00 CET"
[5] "2019-03-30 16:00:00 CET" "2019-03-30 17:00:00 CET"
[7] "2019-03-30 18:00:00 CET" "2019-03-30 19:00:00 CET"
[9] "2019-03-30 20:00:00 CET" "2019-03-30 21:00:00 CET"
[11] "2019-03-30 22:00:00 CET" "2019-03-30 23:00:00 CET"
[13] "2019-03-31 00:00:00 CET" "2019-03-31 01:00:00 CET"
[15] NA "2019-03-31 03:00:00 CEST"
[17] "2019-03-31 04:00:00 CEST" "2019-03-31 05:00:00 CEST"
[19] "2019-03-31 06:00:00 CEST" "2019-03-31 07:00:00 CEST"
[21] "2019-03-31 08:00:00 CEST" "2019-03-31 09:00:00 CEST"
[23] "2019-03-31 10:00:00 CEST" "2019-03-31 11:00:00 CEST"
[25] "2019-03-31 12:00:00 CEST"
显然 POSIXct 无法处理夏令时的开关?这是怎么回事?
我知道我可以使用 lubridates 的 ymd_hm() 来解决这个问题,但我提出这个问题是为了了解这里的工作原理。是否有可能在 base R 中解决这个问题,或者 s.POSIXct 在这里有一个基本的功能障碍?
谢谢。
编辑:解决方案
感谢 zoowalk 和 Roland 对此解决方案的评论:
我的时间序列是在没有时间开关的情况下记录的。然而,我的 OS 时区确实记录了全年的时间转换。因此,我需要将时区交给同样没有时间开关的函数,比如 UTC:
as.POSIXct(xx, format = "%Y-%m-%d %H:%M", tz="UTC")
解决方案
感谢 zoowalk 和 Roland 对此解决方案的评论:
我的时间序列是在没有时间开关的情况下记录的。然而,我的 OS 时区确实记录了全年的时间转换。因此,我需要将时区交给同样没有时间开关的功能,比如 UTC:
as.POSIXct(xx, format = "%Y-%m-%d %H:%M", tz="UTC")
我有与以下格式的时间戳关联的每小时数据。
xx <- c("2019-03-30 12:00", "2019-03-30 13:00", "2019-03-30 14:00", "2019-03-30 15:00", "2019-03-30 16:00", "2019-03-30 17:00", "2019-03-30 18:00", "2019-03-30 19:00", "2019-03-30 20:00", "2019-03-30 21:00", "2019-03-30 22:00", "2019-03-30 23:00", "2019-03-31 00:00", "2019-03-31 01:00", "2019-03-31 02:00","2019-03-31 03:00", "2019-03-31 04:00", "2019-03-31 05:00", "2019-03-31 06:00", "2019-03-31 07:00", "2019-03-31 08:00", "2019-03-31 09:00", "2019-03-31 10:00", "2019-03-31 11:00", "2019-03-31 12:00")
如果我将其转换为 POSIXct,我会得到一种去掉了小时数的格式:
> as.POSIXct(xx)
[1] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[4] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[7] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[10] "2019-03-30 CET" "2019-03-30 CET" "2019-03-30 CET"
[13] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[16] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[19] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[22] "2019-03-31 CET" "2019-03-31 CET" "2019-03-31 CET"
[25] "2019-03-31 CET"
但我需要保留每小时的时间戳。但是,如果我使用正确的格式选项执行 as.POSIXct(),我会遇到以下问题:
> as.POSIXct(xx, format = "%Y-%m-%d %H:%M")
[1] "2019-03-30 12:00:00 CET" "2019-03-30 13:00:00 CET"
[3] "2019-03-30 14:00:00 CET" "2019-03-30 15:00:00 CET"
[5] "2019-03-30 16:00:00 CET" "2019-03-30 17:00:00 CET"
[7] "2019-03-30 18:00:00 CET" "2019-03-30 19:00:00 CET"
[9] "2019-03-30 20:00:00 CET" "2019-03-30 21:00:00 CET"
[11] "2019-03-30 22:00:00 CET" "2019-03-30 23:00:00 CET"
[13] "2019-03-31 00:00:00 CET" "2019-03-31 01:00:00 CET"
[15] NA "2019-03-31 03:00:00 CEST"
[17] "2019-03-31 04:00:00 CEST" "2019-03-31 05:00:00 CEST"
[19] "2019-03-31 06:00:00 CEST" "2019-03-31 07:00:00 CEST"
[21] "2019-03-31 08:00:00 CEST" "2019-03-31 09:00:00 CEST"
[23] "2019-03-31 10:00:00 CEST" "2019-03-31 11:00:00 CEST"
[25] "2019-03-31 12:00:00 CEST"
显然 POSIXct 无法处理夏令时的开关?这是怎么回事?
我知道我可以使用 lubridates 的 ymd_hm() 来解决这个问题,但我提出这个问题是为了了解这里的工作原理。是否有可能在 base R 中解决这个问题,或者 s.POSIXct 在这里有一个基本的功能障碍?
谢谢。
编辑:解决方案
感谢 zoowalk 和 Roland 对此解决方案的评论:
我的时间序列是在没有时间开关的情况下记录的。然而,我的 OS 时区确实记录了全年的时间转换。因此,我需要将时区交给同样没有时间开关的函数,比如 UTC:
as.POSIXct(xx, format = "%Y-%m-%d %H:%M", tz="UTC")
解决方案
感谢 zoowalk 和 Roland 对此解决方案的评论:
我的时间序列是在没有时间开关的情况下记录的。然而,我的 OS 时区确实记录了全年的时间转换。因此,我需要将时区交给同样没有时间开关的功能,比如 UTC:
as.POSIXct(xx, format = "%Y-%m-%d %H:%M", tz="UTC")