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

13

我不确定选择日期时间作为 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 You Stupid Darkness,DPLYR 版本 0.5 和 Lubridate 版本 1.6。


5
试一下这个:date_test[date_test$datetime > as.POSIXct("2016-07-01 01:15:00", tz="UTC"),] 该代码的功能是,从日期测试数据集(date_test)中选取日期时间(datetime)列在“2016-07-01 01:15:00”之后的所有行。 - Dave2e
1
ymd_hms默认使用“UTC”时区的as.POSIXct时间 - as.POSIXct使用系统时区(例如-对于我来说是澳大利亚,对于您来说是伊利诺伊州)- 您需要始终使用ymd_hms或根据Dave的建议更改为“UTC”时区。 - thelatemail
好的,这解决了我长期以来一直存在的一个巨大问题。现在我在新西兰而不是伊利诺伊州,这就解释了为什么时间函数一直没有工作。我从未清楚地意识到,当您使用未指定UTC的日期时,它会默认为系统时钟。我能够让以下内容正常工作。非常感谢!date_test <- date_test %>% filter(datetime > as.POSIXct('2016-07-01 01:15:00', tz="UTC"))test <- date_test[date_test$datetime > as.POSIXct("2016-07-01 01:15:00", tz="UTC"),] test <- as.data.frame(test) - Bill Perry
此外,如果将来有人遇到这个问题,如@thelatemail建议的那样,也可以使用`date_test <- date_test %>% filter(datetime > ymd_hms('2016-07-2 00:00:00'))'。再次感谢您,我不确定如何将您的评论标记为答案,但它是完美的! - Bill Perry
1个回答

23

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接