切换到DST:round_date()返回NAs

时间:2014-07-25 12:52:13

标签: r rounding lubridate

2013年,从中欧时间(CET)到中欧夏令时(CEST)的转换发生在2013-03-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。即使是01:30之前的times,也不会受到过渡的影响。

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

3 个答案:

答案 0 :(得分:2)

看起来罪魁祸首ceiling_dateround_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"

答案 1 :(得分: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"

正如您所看到的那样,尝试将CET增加一小时,并且没有正确处理时区。

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

答案 2 :(得分: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"