基于 POSIXct 日期和时间的子集数据帧大于使用 dplyr 的日期时间
Subset dataframe based on POSIXct date and time greater than datetime using dplyr
我不确定将日期时间选择为 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 with R Studio Version 1.0.143 and R You Stupid Darkness, DPLYR 0.5 and Lubridate 1.6
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
我不确定将日期时间选择为 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 with R Studio Version 1.0.143 and R You Stupid Darkness, DPLYR 0.5 and Lubridate 1.6
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