2017-06-15 5 views
0

Ich habe mehrere Datensätze meist mit 15 Minuten Intervallen der Zeit. Einige Datensätze haben jedoch keine Messwerte (zB sollte die dritte Zeile im Beispiel-Datensatz "Mai 1 2015 00:40 Uhr" sein. Außerdem gibt es einige Zeitschritte, die länger als 15 Minuten sind (siehe zB 3. und 6. Zeile). Wie kann die fehlende Zeitschritte hinzufügen, so dass mein Date mit Intervallen von 15 min und zur gleichen Zeit einstellen, diese Zeitschritte mit mehr als 15-Minuten-Intervallen bis 15 min fortgesetzt?So füllen Sie fehlende und passen unregelmäßige Zeitintervalle in einem data.frame in R

s <- data.frame(Date = c(
         "May 1 2015 00:10AM","May 1 2015 00:25AM", 
         "May 1 2015 00:56AM","May 1 2015 01:10AM", 
         "May 1 2015 01:25AM","May 1 2015 01:41AM", 
         "May 1 2015 01:55AM"), 
         val = c(1:7) 
       ) 

Meine gewünschte Ausgabe wäre die folgende:

> s 
       Date val 
1 May 1 2015 00:10AM 1 
2 May 1 2015 00:25AM 2 
3 May 1 2015 00:40AM NA 
4 May 1 2015 00:55AM 3 
5 May 1 2015 01:10AM 4 
6 May 1 2015 01:25AM 5 
7 May 1 2015 01:40AM 6 
8 May 1 2015 01:55AM 7 
+0

Können Sie Bitte geben Sie ein Beispiel für Ihren endgültigen gewünschten data.frame? – ccapizzano

+0

Entschuldigung für das Format, aber ich brauche so etwas: s <- data.frame (Datum = c ( "Mai 1 2015 00:10 AM", "Mai 1 2015 00:25", "Mai 1 2015 00:40 AM "," 1. Mai 2015 00:55 Uhr "", "1. Mai 2015 01:10 Uhr", "1. Mai 2015 01:25 Uhr", "1. Mai 2015 01:40 Uhr", "1. Mai 2015 01:55 Uhr"), val = c (1,2, NA, 3,4,5,6,7) ) – Jack

+0

Bitte geben Sie die gewünschte Ausgabe in der Frage, nicht im Kommentar. – putu

Antwort

0

Sie könnten versuchen, die folgenden:

Schalten Sie zuerst Ihre s Datenrahmen Variable „Datum“ in POSIXct, so dass Sie mit ihm arbeiten können:

s <- data.frame(Date = c(
    "May 1 2015 00:10AM","May 1 2015 00:25AM", 
    "May 1 2015 00:56AM","May 1 2015 01:10AM", 
    "May 1 2015 01:25AM","May 1 2015 01:41AM", 
    "May 1 2015 01:55AM"), 
    val = c(1:7) 
) %>% dplyr::mutate(Date = lubridate::parse_date_time(Date, "b d Y HM")) 

Zweitens Sie diese mit einem anderen Datenrahmen verbinden können, die Sie erwarten alle die Zeitintervalle hat . Zuerst konstruieren wir es, einen Unterschied von Zeitintervallen (15 Minuten in diesem Fall):

one <- lubridate::parse_date_time("May 1 2015 00:10AM", orders = "b d Y HM") 
two <- lubridate::parse_date_time("May 1 2015 00:25AM", orders = "b d Y HM") 
dif <- two - one 

nun den Datenrahmen:

other_df <- data.frame(
    Date = seq(from = lubridate::parse_date_time("May 1 2015 00:10AM", 
             orders = "b d Y HM"), 
     to = lubridate::parse_date_time("May 1 2015 01:55AM", 
             orders = "b d Y HM"), 
     by = dif)) 

die beiden Join:

result <- dplyr::full_join(other_df, s) 

> result 
        Date val 
1 2015-05-01 00:10:00 1 
2 2015-05-01 00:25:00 2 
3 2015-05-01 00:40:00 NA 
4 2015-05-01 00:55:00 NA 
5 2015-05-01 01:10:00 4 
6 2015-05-01 01:25:00 5 
7 2015-05-01 01:40:00 NA 
8 2015-05-01 01:55:00 7 
9 2015-05-01 00:56:00 3 
10 2015-05-01 01:41:00 6 
+0

Ich hatte eine sehr ähnliche Idee mit "Base" -Codierung, so froh, dass wir auf der gleichen Seite waren. Die endgültige Ausgabe enthält jedoch zusätzliche Zeilen und 'NA's aufgrund der Zeitintervalle, die ein oder zwei Minuten gegenüber dem ursprünglichen' s' data.frame (z. B. '2015-05-01 01: 41: 00' vs . '2015-05-01 01: 40: 00'). – ccapizzano

+0

Das Problem, das ich noch habe, ist, wie Zeitintervalle eingestellt werden, die um eine Minute versetzt sind, so dass alles 15 Minuten Intervall sein wird – Jack

+1

Sie können dies mit der Funktion 'floor_date' in' lubridate' tun und jedes Mal zehn Minuten hinzufügen. Zum Beispiel wird 's $ Date <-lubridate :: floor_date (s $ Date," 15 minutes ") + (60 * 10)' die gewünschten 15-Minuten-Intervalle erzeugen, während die Spalte 'val' intakt bleibt – ccapizzano

Verwandte Themen