筛选R中的多个日期列
我有一个3列的数据框。() 前两列(“Time1”、“Time2”)包含日期时间数据,并且都具有posixct格式:筛选R中的多个日期列,r,data.table,R,Data.table,我有一个3列的数据框。() 前两列(“Time1”、“Time2”)包含日期时间数据,并且都具有posixct格式:%Y-%m-%d%H:%m:%S” 因此,我最终需要的是行的子选择,其中对于Time1中的特定时间,只有行在Time2中被选择 是时间1的前一天(这里一天并不总是24小时;一天是指前一个日历日,基本上是“昨天”) 和时间2是凌晨12:00 一个正确的例子: +---------------------+----------------------+ | Time1
%Y-%m-%d%H:%m:%S”
因此,我最终需要的是行的子选择,其中对于Time1中的特定时间,只有行在Time2中被选择
- 是时间1的前一天(这里一天并不总是24小时;一天是指前一个日历日,基本上是“昨天”)
- 和时间2是凌晨12:00
+---------------------+----------------------+
| Time1 | Time2 |
+---------------------+----------------------+
| 2016-11-01 00:00:00 | 2016-10-31 00:00:00 |
+---------------------+----------------------+
一个错误的例子:
+---------------------+----------------------+
| Time1 | Time2 |
+---------------------+----------------------+
| 2016-11-01 00:00:00 | 2016-10-31 12:00:00 |
+---------------------+----------------------+
在上传的文件中,我手动添加了第三列(“值”),作为我希望在最后过滤的行的指导。带“True”的行对我来说很有趣
我用两个for循环解决了这个问题,但是在大型表中运行速度非常慢 使用
子集
和润滑油
包的解决方案可以使用以下方法:
Time2
,然后选中Time1
&Time2
属于同一天HHMMSS
格式中格式化Time2
,然后检查其是否小于120000
(中午)library(lubridate)
subset(df, format(Time1,"%Y%m%d") == format(Time2+days(1),"%Y%m%d") &
as.integer(format(Time2, "%H%M%S")) < 120000 )
# Time1 Time2 Value
# 19 2016-11-01 00:00:00 2016-10-31 TRUE
# 39 2016-11-01 00:30:00 2016-10-31 TRUE
# 59 2016-11-01 01:00:00 2016-10-31 TRUE
# 79 2016-11-01 01:30:00 2016-10-31 TRUE
# 99 2016-11-01 02:00:00 2016-10-31 TRUE
# 119 2016-11-01 02:30:00 2016-10-31 TRUE
# 139 2016-11-01 03:00:00 2016-10-31 TRUE
# 159 2016-11-01 03:30:00 2016-10-31 TRUE
# 179 2016-11-01 04:00:00 2016-10-31 TRUE
#
# so on
使用
子集
和润滑油
包的解决方案可以使用以下方法:
Time2
,然后选中Time1
&Time2
属于同一天HHMMSS
格式中格式化Time2
,然后检查其是否小于120000
(中午)library(lubridate)
subset(df, format(Time1,"%Y%m%d") == format(Time2+days(1),"%Y%m%d") &
as.integer(format(Time2, "%H%M%S")) < 120000 )
# Time1 Time2 Value
# 19 2016-11-01 00:00:00 2016-10-31 TRUE
# 39 2016-11-01 00:30:00 2016-10-31 TRUE
# 59 2016-11-01 01:00:00 2016-10-31 TRUE
# 79 2016-11-01 01:30:00 2016-10-31 TRUE
# 99 2016-11-01 02:00:00 2016-10-31 TRUE
# 119 2016-11-01 02:30:00 2016-10-31 TRUE
# 139 2016-11-01 03:00:00 2016-10-31 TRUE
# 159 2016-11-01 03:30:00 2016-10-31 TRUE
# 179 2016-11-01 04:00:00 2016-10-31 TRUE
#
# so on
以下解决方案有效。解决方案使用
OP
library(dplyr)
library(lubridate)
df %>%
filter((as.Date(Time2)+days(1)) == as.Date(Time1) & format(Time2, "%H") < 12)
# Time1 Time2 Value
# 1 2016-11-01 00:00:00 2016-10-31 TRUE
# 2 2016-11-01 00:30:00 2016-10-31 TRUE
# 3 2016-11-01 01:00:00 2016-10-31 TRUE
# 4 2016-11-01 01:30:00 2016-10-31 TRUE
# 5 2016-11-01 02:00:00 2016-10-31 TRUE
# 6 2016-11-01 02:30:00 2016-10-31 TRUE
# 7 2016-11-01 03:00:00 2016-10-31 TRUE
# 8 2016-11-01 03:30:00 2016-10-31 TRUE
# 9 2016-11-01 04:00:00 2016-10-31 TRUE
# 10 2016-11-01 04:30:00 2016-10-31 TRUE
# so on
库(dplyr)
图书馆(lubridate)
df%>%
过滤器((截止日期(Time2)+天数(1))==截止日期(Time1)和格式(Time2,“%H”)<12)
#时间1时间2值
#1 2016-11-01 00:00:00 2016-10-31真实
#2 2016-11-01 00:30:00 2016-10-31真实
#3 2016-11-01 01:00:00 2016-10-31真实
#4 2016-11-01 01:30:00 2016-10-31真实
#5 2016-11-01 02:00:00 2016-10-31真实
#6 2016-11-01 02:30:00 2016-10-31真实
#7 2016-11-01 03:00:00 2016-10-31真实
#8 2016-11-01 03:30:00 2016-10-31真实
#9 2016-11-01 04:00:00 2016-10-31真实
#10 2016-11-01 04:30:00 2016-10-31真实
#诸如此类
以下解决方案有效。解决方案使用OP
library(dplyr)
library(lubridate)
df %>%
filter((as.Date(Time2)+days(1)) == as.Date(Time1) & format(Time2, "%H") < 12)
# Time1 Time2 Value
# 1 2016-11-01 00:00:00 2016-10-31 TRUE
# 2 2016-11-01 00:30:00 2016-10-31 TRUE
# 3 2016-11-01 01:00:00 2016-10-31 TRUE
# 4 2016-11-01 01:30:00 2016-10-31 TRUE
# 5 2016-11-01 02:00:00 2016-10-31 TRUE
# 6 2016-11-01 02:30:00 2016-10-31 TRUE
# 7 2016-11-01 03:00:00 2016-10-31 TRUE
# 8 2016-11-01 03:30:00 2016-10-31 TRUE
# 9 2016-11-01 04:00:00 2016-10-31 TRUE
# 10 2016-11-01 04:30:00 2016-10-31 TRUE
# so on
库(dplyr)
图书馆(lubridate)
df%>%
过滤器((截止日期(Time2)+天数(1))==截止日期(Time1)和格式(Time2,“%H”)<12)
#时间1时间2值
#1 2016-11-01 00:00:00 2016-10-31真实
#2 2016-11-01 00:30:00 2016-10-31真实
#3 2016-11-01 01:00:00 2016-10-31真实
#4 2016-11-01 01:30:00 2016-10-31真实
#5 2016-11-01 02:00:00 2016-10-31真实
#6 2016-11-01 02:30:00 2016-10-31真实
#7 2016-11-01 03:00:00 2016-10-31真实
#8 2016-11-01 03:30:00 2016-10-31真实
#9 2016-11-01 04:00:00 2016-10-31真实
#10 2016-11-01 04:30:00 2016-10-31真实
#诸如此类
问题已标记为数据。表
。此外,OP提供的样本数据集属于data.table类。因此,我觉得有义务发布一个数据表解决方案:
library(data.table)
DT[as.IDate(Time1) - 1L == as.IDate(Time2) & hour(Time2) < 12]
as.IDate()
是一个具有整数存储的日期类,用于快速排序和分组。因此,我们可以使用整数算法来计算前一天的数据hour()
也由data.table
包提供,并将一天中的小时数作为整数值返回
可再现数据
2018年5月29日22:00 UTC从复制的数据,但删除了.internal.selfref
指针:
DT <- structure(
list(
Time1 = structure(c(1477958400, 1477958400, 1477958400,
1477958400, 1477958400, 1477958400, 1477958400, 1477960200, 1477960200,
1477960200, 1477960200, 1477960200, 1477960200, 1477960200, 1477962000,
1477962000, 1477962000, 1477962000, 1477962000, 1477962000, 1477962000,
1477963800, 1477963800, 1477963800, 1477963800, 1477963800, 1477963800,
1477963800),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
Time2 = structure(c(1477699200, 1477742400, 1477785600, 1477828800,
1477872000, 1477915200, 1477958400, 1477699200, 1477742400,
1477785600, 1477828800, 1477872000, 1477915200, 1477958400,
1477699200, 1477742400, 1477785600, 1477828800, 1477872000,
1477915200, 1477958400, 1477699200, 1477742400, 1477785600,
1477828800, 1477872000, 1477915200, 1477958400),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
Value = c("FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE")),
.Names = c("Time1", "Time2", "Value"),
row.names = c(NA, -28L),
class = c("data.table", "data.frame"))
DT问题已标记为data.table
。此外,OP提供的样本数据集属于data.table类。因此,我觉得有义务发布一个数据表解决方案:
library(data.table)
DT[as.IDate(Time1) - 1L == as.IDate(Time2) & hour(Time2) < 12]
as.IDate()
是一个具有整数存储的日期类,用于快速排序和分组。因此,我们可以使用整数算法来计算前一天的数据hour()
也由data.table
包提供,并将一天中的小时数作为整数值返回
可再现数据
2018年5月29日22:00 UTC从复制的数据,但删除了.internal.selfref
指针:
DT <- structure(
list(
Time1 = structure(c(1477958400, 1477958400, 1477958400,
1477958400, 1477958400, 1477958400, 1477958400, 1477960200, 1477960200,
1477960200, 1477960200, 1477960200, 1477960200, 1477960200, 1477962000,
1477962000, 1477962000, 1477962000, 1477962000, 1477962000, 1477962000,
1477963800, 1477963800, 1477963800, 1477963800, 1477963800, 1477963800,
1477963800),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
Time2 = structure(c(1477699200, 1477742400, 1477785600, 1477828800,
1477872000, 1477915200, 1477958400, 1477699200, 1477742400,
1477785600, 1477828800, 1477872000, 1477915200, 1477958400,
1477699200, 1477742400, 1477785600, 1477828800, 1477872000,
1477915200, 1477958400, 1477699200, 1477742400, 1477785600,
1477828800, 1477872000, 1477915200, 1477958400),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
Value = c("FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "FALSE",
"FALSE", "TRUE", "FALSE", "FALSE")),
.Names = c("Time1", "Time2", "Value"),
row.names = c(NA, -28L),
class = c("data.table", "data.frame"))
DT首先,pastebin的代码给出了一个错误“error:unexpected”%filter(time2-time1抱歉,我重新加载了该文件。它以前是一个data.table。现在我上传了一个data.frame。---我不知道如何表述(time2-time1@UDE_学生您的数据非常大。为什么不共享dput(head(df,20))
?这对每个人来说都会更容易。是的,你是对的,我用较短的版本更新了我的初始帖子:我使用lubridate
在base-R中添加了一个可能的解决方案。请看一看,首先,来自pastebin的代码给出了一个错误“error:unexpected%”过滤器(time2-time1抱歉,我重新上传了这个文件。它以前是一个data.table。现在我上传了一个data.frame。---我不知道如何表达(time2-time1@UDE_Student您的数据非常大。为什么不共享dput(head(df,20))
?这对每个人来说都会更容易。是的,你是对的,我用较短的版本更新了我的初始帖子:我使用lubridate在base-R中添加了一个可能的解决方案。看一看,两条小评论。1)您不需要在dplyr
链中使用$
。也许,您应该在OP
共享的数据上尝试您的解决方案,并检查它是否返回有效的输出。两个小注释。1)您不需要在dplyr
链中使用$
。也许,您应该在OP
共享的数据上尝试您的解决方案,并检查它是否返回有效的输出。很好地使用as.IDate
!实际上,OP
提供的数据在data.frame
中。我想提供一个base-R解决方案,以便t原始
结果中的行名称,让OP知道选择了哪些行