使用dplyr基于POSIXct日期和时间的子集数据帧大于datetime

时间:2017-05-09 22:27:50

标签: r filter dplyr lubridate posixct

我不确定选择日期时间作为POSIXct格式会出现什么问题。我已经阅读了几个关于基于as.Date对数据帧进行子集化的评论,我可以在没有问题的情况下使用它。我还阅读了许多帖子,建议过滤POSIXct格式应该有效,但由于某些原因我不能让它工作。

示例数据框:

library(lubridate)
library(dplyr)

date_test <- seq(ymd_hms('2016-07-01 00:00:00'),ymd_hms('2016-08-01 00:00:00'), by = '15 min')
date_test <- data.frame(date_test)
date_test$datetime <- date_test$date_test
date_test <- select(date_test, -date_test)

我检查它是否采用POSIXct格式,然后尝试了几种方法来对数据帧进行子集化,大于2016-07-01 01:15:00。但是输出从未显示日期时间小于2016-07-01 01:15:00被删除。我很抱歉,如果有人问过这个问题,我找不到它,但我已经看过并试图让它发挥作用。我使用UTC作为时区来避免夏令时问题,因此这不是问题 - 除非过滤器需要它。

class(date_test$datetime)

date_test <- date_test %>% filter(datetime > '2016-07-01 01:15:00')

date_test <- date_test %>% 
  filter(datetime > as.POSIXct("2016-07-01 00:15"))

date_test <- subset(date_test, datetime > as.POSIXct('2016-07-01 01:15:00')) 

现在,如果我使用过滤:

date_test <- date_test %>% 
  filter(datetime > as.POSIXct("2016-07-10 01:15:00"))

输出很奇怪,有一天落后和错误的时间?

2016-07-09 13:30:00
2016-07-09 13:45:00
2016-07-09 14:00:00
2016-07-09 14:15:00
2016-07-09 14:30:00

如果它有助于我使用MAC OS Sierra与R Studio版本1.0.143和R你愚蠢黑暗,DPLYR 0.5和Lubridate 1.6

1 个答案:

答案 0 :(得分:4)

ymd_hms默认情况下在“UTC”时区使用POSIXct次 - as.POSIXct使用系统时区(例如 - 澳大利亚代表我) - 您需要始终使用ymd_hms或根据Dave在评论中的建议更改为“UTC”时区。

例如:这些例子起作用:

date_test <- seq(ymd_hms('2016-07-01 00:30:00'),ymd_hms('2016-07-01 01:30:00'), by = '15 min')
date_test <- data.frame(datetime=date_test)
date_test

#             datetime
#1 2016-07-01 00:30:00
#2 2016-07-01 00:45:00
#3 2016-07-01 01:00:00
#4 2016-07-01 01:15:00
#5 2016-07-01 01:30:00

date_test %>% 
  filter(datetime > as.POSIXct("2016-07-01 01:00:00", tz="UTC"))

date_test %>% 
  filter(datetime > ymd_hms("2016-07-01 01:00:00"))

#             datetime
#1 2016-07-01 01:15:00
#2 2016-07-01 01:30:00