首页 > 解决方案 > 按向量过滤日期时间

问题描述

这可能真的很简单。在第一种情况下,使用总统数据,我可以按年份或第 2 年进行过滤。我得到相同的结果。

但是,当我使用 posixct 数据并尝试以类似方式进行过滤时,我遇到了问题。

当我写

school_hours2<-as.character(c(07:18))

我可以看到 school_hours 2 中的值是“7”、“8”、“9”等,而在 school_hours 中它们是“07”“08”“09”等

编辑:我认为这解释了这种差异呢?编辑:我可以看到比较整数:字符的问题,甚至当我将向量写为.character 时,向量中的值与我想要的不匹配。

我想要的是能够按 school_hours2 过滤。因为这意味着我可以认为“我想在这两次之间进行过滤”并将上限和下限放入其中。而不必写出两者之间的所有间隔点。我怎么得到这个?

为什么用“Y”过滤比用“H”过滤容易?

library (tidyverse)
#some data - filtering works
data(presidential)
head(presidential)
str(presidential)
presidential%>%filter(format(as.Date(start),"%Y")<=2005)
years<-c('1979', '1980', '1981', '1982', 
                '1983', '1984', '1985', '1986',
                '1987', '1988', '1989', '1990'
)
years2<-c(1950:1990)
presidential%>%filter(format(as.Date(start),"%Y")%in% years2)
presidential%>%filter(format(as.Date(start),"%Y")%in% years)


#some date time data - filtering.
test_data<-sample(seq(as.POSIXct('2013/01/01'), as.POSIXct('2017/05/01'), by="day"), 1000)
td<-as.data.frame(test_data)%>%mutate(id = row_number())

school_hours<-c('07', '08', '09', '10', 
                '11', '12', '13', '14',
                '15', '16', '17', '18'
                  )
school_hours2<-c(07:18)
school_years<-c(2015,2016,2017)
school_years2<-c(2015:2017)

str(td)
test1<-td%>%
  filter(id >=79)

schools<-td%>%
  filter(format(test_data,'%H') %in% school_hours)

schools2<-td%>%
  filter(format(test_data,'%H') %in% school_hours2)

schools3<-td%>%
  filter(format(test_data,'%Y')==2017)

schools4<-td%>%
  filter(format(test_data,'%Y') %in% school_years)

schools5<-td%>%
  filter(format(test_data,'%Y') %in% school_years2)

这是我的问题:在上面的代码中,当我尝试使用 school_hours 或 school_hours2 过滤 td (包含 posixct 数据)时,我得到的数据为零。为什么?

我想做的不是写作

school_hours<-c('07', '08', '09', '10', 
                    '11', '12', '13', '14',
                    '15', '16', '17', '18'
                      )

我会写

school_hours2<-c(07:18)

就像我在 school_years 一样,过滤会起作用。这不起作用

schools2<-td%>%
  filter(format(test_data,'%H') %in% school_hours2)

这确实有效

schools5<-td%>%
  filter(format(test_data,'%Y') %in% school_years2)

为什么?

我问是因为:我使用了类似的东西来过滤我无法分享的真实数据,并且我得到了一个差异。

当我使用 school_hours (这是一个字符)时,我生成了 993 条记录,第一次是 07:00。当我使用 school_hours2(它是一个整数)时,我生成了 895 条记录,第一次是 10:00。我知道 - “没有数据我们无法进行任何评估”但我无法解决的是为什么两个不同的矢量过滤器工作方式不同。是因为 school_hours 包含字符和 school_hours2 整数吗?

编辑:我将 test_data 行更改为:

#some date time data - filtering.
test_data<-as.POSIXct(sample(seq(1127056501, 1127056501), 1000),origin = "1899-12-31",tz="UTC")

它仍然有问题:

schools<-td%>%
  filter(format(test_data,'%H') %in% school_hours)

生成 510 行

schools2<-td%>%
  filter(format(test_data,'%H') %in% school_hours2)

生成 379 行

我真正感兴趣的所有数据看起来像这样 1899-12-31 23:59:00

(其中最后 6 位数字代表 24 小时时钟时间)

我真正想做的就是将时间从 1899-12-31 07:59:00 转换为小时 (7)

接着

利用

school_hours2<-c(07:18)

作为过滤器。但是将 1899-12-31 07:59:00 转换生成的小时

是 07 或 7

因为如果是 07,那么 school_hours2<-c(07:18) 生成 7 并且 school_hours2<-as.character(c(07:18)) 生成 '7'

我该如何解决这个问题?

编辑:像这样: R:如何按小时和分钟过滤时间戳?

td1<-td%>%mutate(timestamp_utc = ymd_hms(test_data,tz="UTC"))%>%
  mutate(hour = hour(timestamp_utc))%>%
filter(hour(timestamp_utc) %in% school_hours)

td2<-td%>%mutate(timestamp_utc = ymd_hms(test_data,tz="UTC"))%>%
  mutate(hour = hour(timestamp_utc))%>%
  filter(hour(timestamp_utc) %in% school_hours2)

td3<-td%>%
  mutate(hour = hour(test_data))%>%
  filter(hour(test_data) %in% school_hours2)

标签: rdatetimetidyverseposixct

解决方案


在我的问题中闲逛并自言自语之后

我找到了这个线程: 按时间戳过滤数据集

它帮助我意识到如何在时间戳中隔离小时,然后使用它来正确过滤数据。

最后的答案是通过这个来隔离小时

filter(hour(timestamp_utc) %in% school_hours2)

推荐阅读