3

2013 年,从中欧时间 (CET) 到中欧夏令时间 (CEST) 的转换发生在 2013 年 3 月 31 日星期日。时钟从凌晨 2 点到下午 3 点提前一小时,所以基本上没有凌晨 2 点。

start <- strptime("2013-03-31 01:00:00", format="%F %T", tz="CET")
times <- start + (0:5) * 60*15
times 
[1] "2013-03-31 01:00:00 CET"  "2013-03-31 01:15:00 CET" 
[3] "2013-03-31 01:30:00 CET"  "2013-03-31 01:45:00 CET" 
[5] "2013-03-31 03:00:00 CEST" "2013-03-31 03:15:00 CEST"

将向量四舍五入times为小时给出 NA。即使times在 01:30 之前,也完全不受过渡的影响。

library(lubridate)
round_date(times, unit = "hour")
[1] "2013-03-31 01:00:00 CET"  NA                        
[3] NA                         NA                        
[5] NA                         "2013-03-31 03:00:00 CEST"

这似乎是一个错误,或者我错过了什么?我在跑步:

sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=German_Austria.1252  LC_CTYPE=German_Austria.1252   
[3] LC_MONETARY=German_Austria.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Austria.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] lubridate_1.3.3

loaded via a namespace (and not attached):
[1] digest_0.6.4  memoise_0.2.1 plyr_1.8.1    Rcpp_0.11.2   stringr_0.6.2
4

3 回答 3

2

看起来罪魁祸首是由以下人员ceiling_date调用的round_date

ceiling_date(times,"hour")
[1] "2013-03-31 01:00:00 CET"  NA                        
[3] NA                         NA                        
[5] NA                         "2013-03-31 04:00:00 CEST"

查看它通过将 1 添加到小时来工作的代码,从而创建一个不存在的时间。这绝对是一个错误。

base::round支持时间做你想做的事:

round(times,"hour")
[1] "2013-03-31 01:00:00 CET"  "2013-03-31 01:00:00 CET" 
[3] "2013-03-31 03:00:00 CEST" "2013-03-31 03:00:00 CEST"
[5] "2013-03-31 03:00:00 CEST" "2013-03-31 03:00:00 CEST"
于 2014-07-25T13:16:48.247 回答
1

这是一个边缘情况,您可以将这种行为视为错误。round_date使用ceiling_date并发生这种情况:

y <- floor_date(times - eseconds(1), "hour")
#[1] "2013-03-31 00:00:00 CET"  "2013-03-31 01:00:00 CET"  "2013-03-31 01:00:00 CET"  "2013-03-31 01:00:00 CET"  "2013-03-31 01:00:00 CET"  "2013-03-31 03:00:00 CEST"
hour(y) <- hour(y) + 1
#[1] "2013-03-31 01:00:00 CET"  NA                         NA                         NA                         NA  "2013-03-31 04:00:00 CEST"

如您所见,它试图将 2013-03-31 01:00:00 CET 增加一小时,并且无法正确处理时区。

根本问题可能出在"hour<-"POSIXct S4 方法中。

于 2014-07-25T13:15:38.290 回答
0

这已在 master 中修复:

> times <- ymd_hms("2013-03-31 01:00:00 CET", "2013-03-31 01:15:00 CEST",
+                  "2013-03-31 01:30:00 CEST", "2013-03-31 01:45:00 CEST",
+                  "2013-03-31 03:00:00 CEST", "2013-03-31 03:15:00 CEST",
+                  tz = "Europe/Amsterdam")
> round_date(times, unit = "hour")
[1] "2013-03-31 01:00:00 CET"  "2013-03-31 01:00:00 CET"  "2013-03-31 03:00:00 CEST"
[4] "2013-03-31 03:00:00 CEST" "2013-03-31 03:00:00 CEST" "2013-03-31 03:00:00 CEST"
> ceiling_date(times, unit = "hour")
[1] "2013-03-31 01:00:00 CET"  "2013-03-31 03:00:00 CEST" "2013-03-31 03:00:00 CEST"
[4] "2013-03-31 03:00:00 CEST" "2013-03-31 03:00:00 CEST" "2013-03-31 04:00:00 CEST"
于 2015-04-27T22:41:39.700 回答