首页 > 解决方案 > lubridate:解析“27.10.2013 02A:00”形式的日期(夏令时)

问题描述

我正在尝试25.10.2013 17:30使用 lubridates 函数将形式的字符串(时区是 CET/CEST,但这未在字符串本身中指定)解析为 POSIXct dmy_hm(..., tz = 'Europe/Brussels')

我有一个问题,在解析后,在 CEST 切换到 CET 的那一天有重复的值(时钟跳回一小时)。原因似乎是我的数据中显示这种转变的方式:02A:00对于 2 点钟 CEST 和02B:002 点钟 CET,这是一小时后。dmy_hm(..., tz = 'Europe/Brussels')将两者都解释为 CET。

最小的工作示例:

> library(lubridate)

> times = c("27.10.2013 01:00", "27.10.2013 02A:00",
            "27.10.2013 02B:00", "27.10.2013 03:00")

> times = dmy_hm(times, tz = "Europe/Brussels")

> times
[1] "2013-10-27 01:00:00 CEST" "2013-10-27 02:00:00 CET"
[3] "2013-10-27 02:00:00 CET"  "2013-10-27 03:00:00 CET"

我的问题是:解决“错误”日期的最佳方法是什么?

我尝试使用which(duplicated(times))查找重复值的索引并从“错误”值中删除一小时,但似乎还有另一个问题:

> times[2] - hours(1)
[1] "2013-10-27 01:00:00 CEST"

为什么从 '"2013-10-27 02:00:00 CET"' 中删除一小时会将我带到 '"2013-10-27 01:00:00 CEST"'?这不是两个小时的跳跃吗?我希望降落在“2013-10-27 02:00:00 CEST”。


编辑:最后一部分是一个已知问题(参见https://github.com/tidyverse/lubridate/issues/498)。解决方案是使用dhours()而不是hours()

> times[2] - dhours(1)
[1] "2013-10-27 02:00:00 CEST"

标签: rdatetimetimezonelubridate

解决方案


推荐阅读