Фильтр df с датой и временем - PullRequest
1 голос
/ 31 января 2020

У меня есть фрейм данных, который я пытаюсь отфильтровать по двум столбцам: дате и времени.

В настоящее время у меня есть другая функция (get_datetime), которая принимает дату в формате «ГГГГММДД» и время 'ЧЧММ' и возвращает объект POSIXct.

Мое условие фильтра включено, если datetime находится в пределах определенного количества часов (hour_diff), и это то, что у меня сейчас есть:

rows <- rows[abs(as.numeric(difftime(datetime, get_datetime(rows$file_date, rows$file_time), units='hours'))) <= hour_diff,]

get_datetime <- function(date, time) {
  #format date and time into POSIXct object
  year <- substr(landfall_date, 1, 4)
  month <- substr(landfall_date, 5, 6)
  day <- substr(landfall_date, 7, 8)
  hour <- substr(landfall_time, 1, nchar(landfall_time) - 2)
  minute <- substr(landfall_time, nchar(landfall_time) - 1, nchar(landfall_time))
  datetime <- as.POSIXct(paste0(year, '-', month, '-', day, ' ', hour, ':', minute, ':00'))
  return(datetime)
}

Как передать get_datetime отдельную дату и время, а не все столбцы даты и времени, или есть альтернативный способ для меня правильно отфильтровать строки?

Вот некоторые примеры данных:

enter image description here

structure(list(county = structure(1:6, .Label = c("beaufort", "bertie", "brunswick", "camden", "carteret", "chowan"), class = "factor"), file_date = c(19900724L, 19900724L, 19900725L, 19900725L, 19900726L, 19900726L), file_time = c(300L, 1200L, 1800L, 1800L, 1200L, 1800L)), class = "data.frame", row.names = c(NA, -6L))

datetime <- as.POSIXct('1990-07-25 12:00')
hour_diff <- 12

С указанным выше указанным временем и 12 часами в качестве часа_данных я бы хотел получить средние 4 строки (bert ie , Брансуик, Камден, Картерет).

1 Ответ

1 голос
/ 31 января 2020

Я рекомендую пакет stringr и anytime, чтобы очистить ваши даты и время.

library(anytime)
library(stringr)
library(dplyr)
library(lubridate)

#pad your times that are less than 4 digits
df$file_time = str_pad(df$file_time,width=4,side = "left", pad= "0")

#convert your date and time to datetime 
df$new_dt = anytime(paste(df$file_date, df$file_time))

#create an hour flag
df$hour = hour(df$new_dt)

#filter to get your result:
df %>% filter( hour == '12')
    county file_date file_time              new_dt hour
1   bertie  19900724      1200 1990-07-24 12:00:00   12
2 carteret  19900726      1200 1990-07-26 12:00:00   12

ИЛИ, если вы хотите диапазон дат от 1990-07-24 12:00:00 до 1990-07-26 12:00:00

df %>% filter(new_dt >= '1990-07-24 12:00:00' & new_dt <= '1990-07-26 12:00:00')
     county file_date file_time              new_dt hour
1    bertie  19900724      1200 1990-07-24 12:00:00   12
2 brunswick  19900725      1800 1990-07-25 18:00:00   18
3    camden  19900725      1800 1990-07-25 18:00:00   18
4  carteret  19900726      1200 1990-07-26 12:00:00   12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...