首页 > 解决方案 > R中的夏令时 - 正确读取时间戳的问题

问题描述

我正在尝试从 csv 读取 15 分钟的数据。我一直在努力解决似乎被错误检测到的夏令时。这是我拥有的时间戳的一个小样本(我的 tz = 'Europe/Berlin')。请注意,在此示例中,由于夏令时的时间偏移是从 03:00 到 02:00。

library(lubridate) 
library(dplyr)

dt <- c('29.10.2017 01:30 - 29.10.2017 01:45',
        '29.10.2017 01:45 - 29.10.2017 02:00',
        '29.10.2017 02:00 - 29.10.2017 02:15',
        '29.10.2017 02:15 - 29.10.2017 02:30',
        '29.10.2017 02:30 - 29.10.2017 02:45',
        '29.10.2017 02:45 - 29.10.2017 03:00',## end of daylight savings
        '29.10.2017 02:00 - 29.10.2017 02:15',
        '29.10.2017 02:15 - 29.10.2017 02:30',
        '29.10.2017 02:30 - 29.10.2017 02:45',
        '29.10.2017 02:45 - 29.10.2017 03:00')

我的目标是将每个时段的开始时间保存为 POSIXct,但是由于夏令时导致的时间偏移没有正确标记,导致时间戳重复。

dt <- strsplit(dt, split = ' -') %>% unlist() %>% matrix(byrow = TRUE, ncol = 2) 
dtstart <- as_datetime(dt[, 1], format = '%d.%m.%Y %H:%M', tz = "CET") 
dtstart
#  [1] "2017-10-29 01:30:00 CEST" "2017-10-29 01:45:00 CEST"
#  [3] "2017-10-29 02:00:00 CEST" "2017-10-29 02:15:00 CEST"
#  [5] "2017-10-29 02:30:00 CEST" "2017-10-29 02:45:00 CEST"
#  [7] "2017-10-29 02:00:00 CEST" "2017-10-29 02:15:00 CEST"
#  [9] "2017-10-29 02:30:00 CEST" "2017-10-29 02:45:00 CEST"

我的想法是使用期末,然后减去 15 分钟,但再次产生重复

dtend <-  as_datetime(dt[, 2], format = '%d.%m.%Y %H:%M', tz = "CET")
dtend
#  [1] "2017-10-29 01:45:00 CEST" "2017-10-29 02:00:00 CEST"
#  [3] "2017-10-29 02:15:00 CEST" "2017-10-29 02:30:00 CEST"
#  [5] "2017-10-29 02:45:00 CEST" "2017-10-29 03:00:00 CET" ## should be CEST ?
#  [7] "2017-10-29 02:15:00 CET"  "2017-10-29 02:30:00 CET" 
#  [9] "2017-10-29 02:45:00 CET"  "2017-10-29 03:00:00 CET"

dtend[6]-dtend[10]
# Time difference of 0 secs

有解决方法还是我做错了什么?

标签: rdatetimelubridate

解决方案


推荐阅读