2016-08-29 5 views
2

Ich habe einen Datensatz wie dies in example.txtSubset Datensatz mit Zeitbedingung in R

"09/Jan/2016" "05:00:22" "304" 449 
"09/Jan/2016" "07:00:12" "304" 449 
"09/Jan/2016" "10:00:02" "200" 10575 
"09/Jan/2016" "11:00:03" "304" 449 
"09/Jan/2016" "13:00:03" "304" 449 
"09/Jan/2016" "20:00:03" "304" 449 
"09/Jan/2016" "23:00:03" "304" 450 
"10/Jan/2016" "00:00:03" "304" 449 
"10/Jan/2016" "03:00:03" "304" 449 
"10/Jan/2016" "04:00:03" "304" 449 

Kann ich meine Daten-Sets aus Bereich 6 Stunden Teilmenge, bevor ich meinen Code in R laufen? Zum Beispiel habe ich öffnen und führen Sie meinen Code in der 10. Januar, um 04.15 Uhr, also möchte ich von meinem Dataset Teilmenge, wie

"09/Jan/2016" "23:00:03" "304" 450 
"10/Jan/2016" "00:00:03" "304" 449 
"10/Jan/2016" "03:00:03" "304" 449 
"10/Jan/2016" "04:00:03" "304" 449 

welche Funktion soll ich für meine Frage benutzen? und wie man es benutzt? Vielen Dank für Ihre Antwort ..

Antwort

2

die 4 Spalten Unter der Annahme, die Sie haben, haben Namen V1, V2, V3 und V4 und der Datenrahmen ist df

Sie können dies tun, in base R von

mergedDateTime <- as.POSIXct(paste(df$V1, df$V2), format = "%d/%b/%Y %H:%M:%S") 
df[(Sys.time() - 6*60*60) < mergedDateTime & Sys.time() > mergedDateTime, ] 

Für das gegebene Beispiel würde dies Arbeit als,

x <- "01/10/2016 04:15:00" 
mergedDateTime <- as.POSIXct(paste(df$V1, df$V2), format = "%d/%b/%Y %H:%M:%S") 
df[(as.POSIXct(x, format = "%m/%d/%Y %H:%M:%S") - 6*60*60) < mergedDateTime & 
       as.POSIXct(x, format = "%m/%d/%Y %H:%M:%S") > mergedDateTime, ] 


#  V1  V2  V3 V4 
#7 09/Jan/2016 23:00:03 304 450 
#8 10/Jan/2016 00:00:03 304 449 
#9 10/Jan/2016 03:00:03 304 449 
#10 10/Jan/2016 04:00:03 304 449 
2

Der lubridate und chron Pakete, wenn sie in Verbindung verwendet wird, sind sehr leistungsfähig und ausdruck für Datums- und Zeitarbeits:

library(readr) 
library(chron) 
library(lubridate) 

# read the data in 
df_foo = read_table(file = '"09/Jan/2016" "05:00:22" "304" 449 
"09/Jan/2016" "07:00:12" "304" 449 
"09/Jan/2016" "10:00:02" "200" 10575 
"09/Jan/2016" "11:00:03" "304" 449 
"09/Jan/2016" "13:00:03" "304" 449 
"09/Jan/2016" "20:00:03" "304" 449 
"09/Jan/2016" "23:00:03" "304" 450 
"10/Jan/2016" "00:00:03" "304" 449 
"10/Jan/2016" "03:00:03" "304" 449 
"10/Jan/2016" "04:00:03" "304" 449', 
        col_names = c("Date", "Time", "Value1", "Value2")) 

# parse dates and times 
df_foo = df_foo %>% 
    mutate(
    # parse the dates 
    Date = as.Date(gsub('"', "", Date), format = "%d/%b/%Y"), 
    # parse the times 
    Time = times(format(gsub('"', "", Time), format = "%H:%M:%S")), 
    Value1 = as.integer(gsub('"', "", Value1)), 
    # datetime 
    Datetime = ISOdatetime(
     month = month(Date), 
     day = days(Date), 
     hour = hours(Time), 
     sec = seconds(Time), 
     min = minutes(Time), 
     year = year(Date) 
    ) 
) 

# filter to data within 6 hours of the current time 
df_foo %>% 
    filter(
    Datetime > Sys.time() - dhours(6) 
) 

Offensichtlich, da die Datenprobe Sie haben in der Frage enthalten, gibt dies nichts zurück.

+0

Dies könnte viel einfacher gemacht werden in lubridate - 'parse_date_time (einfügen (df_foo $ Datum, df_foo $ Zeit), orders =" dmyHMS ")' zum Beispiel oder sogar in der Basis R ist es nur eine Zeile - 'as.POSIXct (einfügen (df_foo $ Date, df_foo $ Zeit), format = "% d /% b /% Y% H:% M:% S", tz = "UTC") ' – thelatemail

+0

@thelatemail Sie beziehen sich auf die Datetime-Konstruktion? Meine Version ist auch ein Aufruf von 'ISOdatetime'. Ich kann die Einsparungen in keiner Ihrer Versionen sehen. – tchakravarty

Verwandte Themen