Фильтрация даты и времени по вектору - PullRequest
1 голос
/ 01 октября 2019

Это, наверное, действительно просто. В первом случае, используя президентские данные, я могу фильтровать по годам или годам 2. И я получаю тот же результат.

Однако, когда я использую данные posixct и пытаюсь фильтровать аналогичным образом, я сталкиваюсь спроблемы.

Когда я пишу

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

, я вижу значения в school_hours 2 "7", "8", "9" и т. д., тогда как в school_hours они равны "07" "08 "" 09 "и т. Д.

РЕДАКТИРОВАТЬ: Я думаю, что это объясняет эту разницу тогда? РЕДАКТИРОВАТЬ: я вижу проблему сравнения целое число: символ, и даже когда я пишу вектор as.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)

Вот мой вопрос: в коде выше, когда я пытаюсь фильтровать td (который содержит данные posixct) используя school_hours или school_hours2 я получаю ноль возвращаемых данных. Почему?

То, что я хотел бы сделать, это вместо того, чтобы писать

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' </p>

Как мне обойти это?

РЕДАКТИРОВАТЬ: КАК ЭТО: 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)

1 Ответ

0 голосов
/ 01 октября 2019

После долгих прогулок и разговоров с собой в моем вопросе

я нашел эту тему: фильтрация набора данных по отметке времени

, и это помогло мнепонять, как выделить час в метке времени, а затем использовать его для правильной фильтрации данных.

окончательный ответ состоит в том, чтобы выделить час этим

filter(hour(timestamp_utc) %in% school_hours2)
...