按矢量过滤日期时间
Filtering datetime by vector
这可能真的很简单。
在第一种情况下,使用总统数据,我可以按年份或年份 2 进行过滤。我得到了相同的结果。
但是,当我使用 posixct 数据并尝试以类似的方式进行过滤时,我 运行 遇到了问题。
当我写
school_hours2<-as.character(c(07:18))
我可以看到 school_hours 2 中的值是
“7”、“8”、“9”等
而在
school_hours 他们是
“07”“08”“09”等
编辑:我认为这可以解释这种差异吗?
编辑:我可以看到比较 integer:character 的问题,甚至当我写向量 as.character 时,向量中的值与我想要的不匹配。
我想要的是能够按 school_hours2 进行过滤。因为这意味着我可以考虑 "i'd like to filter between these two times" 并将上限和下限放入。而不是必须在两者之间写下所有间隔点。我怎么得到这个?
为什么按 "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。
我知道 - "without the data we can't make any evaluation" 但我无法解决的是为什么这两个不同的矢量滤波器的工作方式不同。是因为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'
我该如何解决这个问题?
编辑:
像这样:
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)
在我的问题中经过大量的思考和自言自语
我找到了这个帖子:
它帮助我了解了如何隔离时间戳中的小时,然后使用它来正确过滤数据。
最后的答案是通过这个来隔离小时
filter(hour(timestamp_utc) %in% school_hours2)
这可能真的很简单。 在第一种情况下,使用总统数据,我可以按年份或年份 2 进行过滤。我得到了相同的结果。
但是,当我使用 posixct 数据并尝试以类似的方式进行过滤时,我 运行 遇到了问题。
当我写
school_hours2<-as.character(c(07:18))
我可以看到 school_hours 2 中的值是 “7”、“8”、“9”等 而在 school_hours 他们是 “07”“08”“09”等
编辑:我认为这可以解释这种差异吗? 编辑:我可以看到比较 integer:character 的问题,甚至当我写向量 as.character 时,向量中的值与我想要的不匹配。
我想要的是能够按 school_hours2 进行过滤。因为这意味着我可以考虑 "i'd like to filter between these two times" 并将上限和下限放入。而不是必须在两者之间写下所有间隔点。我怎么得到这个?
为什么按 "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。 我知道 - "without the data we can't make any evaluation" 但我无法解决的是为什么这两个不同的矢量滤波器的工作方式不同。是因为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'
我该如何解决这个问题?
编辑:
像这样:
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)
在我的问题中经过大量的思考和自言自语
我找到了这个帖子:
它帮助我了解了如何隔离时间戳中的小时,然后使用它来正确过滤数据。
最后的答案是通过这个来隔离小时
filter(hour(timestamp_utc) %in% school_hours2)