【问题标题】:Handling of switch to daylight saving time with POSIXct in R在 R 中使用 POSIXct 处理切换到夏令时
【发布时间】:2020-12-03 13:12:19
【问题描述】:

我有与以下格式的时间戳相关联的每小时数据。

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() 来解决这个问题,但我提出这个问题是为了了解这里的工作原理。是否有可能在基础 R 中解决这个问题,或者 s.POSIXct 在这里有基本的功能障碍吗?

谢谢。

编辑:解决方案

感谢 cmets 中的 zoowalk 和 Roland 提供此解决方案:

我的时间序列是在没有时间开关的情况下录制的。但是,我的操作系统时区确实记录了全年的时间切换。因此,我需要将一个时区交给同样没有时间开关的函数,比如 UTC:

as.POSIXct(xx, format = "%Y-%m-%d %H:%M", tz="UTC")

【问题讨论】:

  • 这不只是因为"2019-03-31 02:00" 不是实时的吗?如果时钟在夏季时间提前一小时,那么它们会从"2019-03-31 01:59:59" 滴答到"2019-03-31 03:00:00",因此 R 将"2019-03-31 02:00:00" 等同于NA 是正确的,因为“02:00:00”从未存在过。这不是有点像在 2 月 30 日NA 时对 R 感到恼火吗?
  • AFAIKT 这在很大程度上取决于您想在哪个时区工作。如果您使用 UTC,这里就不会出现问题。 as.POSIXct(xx, format = "%Y-%m-%d %H:%M", tz="UTC")
  • +1 到 @zoowalk 如果您有没有切换到 DST 的时间戳,请使用不切换到 DST 的时区。 R 可以很好地处理 DST 切换,这就是这里的问题,因为您的数据不会切换,并且您使用的是默认时区(操作系统时区),该时区在您的语言环境中的 CET/CEST 之间切换。
  • @Ben 您能否提供解决方案作为下面的答案并接受它。

标签: r na posixct


【解决方案1】:

解决方案

感谢 cmets 中的 zoowalk 和 Roland 提供此解决方案:

我的时间序列是在没有时间开关的情况下录制的。但是,我的操作系统时区确实记录了全年的时间切换。因此,我需要将一个时区交给同样没有时间开关的函数,比如 UTC:

as.POSIXct(xx, format = "%Y-%m-%d %H:%M", tz="UTC")

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2019-12-16
    • 2015-04-09
    • 2010-10-12
    • 2021-02-24
    • 2012-10-20
    • 2013-03-18
    • 2022-07-20
    • 2016-04-09
    相关资源
    最近更新 更多