2017-05-19 3 views
1

beim Erstellen eines xts Objekt von einem data.frame Ich scheine einige Daten zu verlieren (ca. 3000 Daten verloren über 33 000).R: Erstellen XTS Änderungen Datensatz, Verlust von Daten

My-Datensatz ist wie folgt: (mit der Zeit, Tag-Monat-Jahr sein, EU-Format)

> head(mesdonnees) 
       time value 
1 05-03-2006 04:07 NA 
2 05-03-2006 04:17 NA 
3 05-03-2006 04:27 NA 
4 05-03-2006 04:37 NA 
5 05-03-2006 04:47 NA 
6 05-03-2006 04:57 NA 

Aufgrund des Formats ich die verschiedenen Teile des Datums zu extrahieren hatte (zumindest ich couldn 't erhalten as.POSIXct, um mit diesem Format zu arbeiten). Hier ist, wie ich es tat:

# Extract characters and define as S.... 
Syear <- substr(mesdonnees$time, 7,10) 
Smonth <- substr(mesdonnees$time, 4,5) 
Sday <- substr(mesdonnees$time, 1, 2) 

#Gather all parts and use "-" as sep 
datetext <- paste(Syear, Smonth, Sday, sep="-") 
#define format of each part of the string 
formatdate<-as.POSIXct(datetext, format="%Y-%m-%d", tz = "GMT") 

ich dann versuche, meine erstellen xts mit ...

xtsdata <- xts(mesdonnees$value, order.by = formatdate, tz = "GMT") 

... aber wenn dies zu tun bekomme ich ein paar ziemlich seltsame Ergebnisse: Der erste Wert ist in 1900

> head(xtsdata) 
      [,1] 
1900-01-04 NA 
2006-03-05 NA 
2006-03-05 NA 
2006-03-05 NA 
2006-03-05 NA 
2006-03-05 NA 

und viele (3000) Termine nicht eingehalten:

> xtsdata[30225:30233,] 
      [,1] 
2006-12-31 0 
2006-12-31 0 
2006-12-31 0 
2006-12-31 0 
<NA>   NA 
<NA>   NA 
<NA>   NA 
<NA>   NA 
<NA>   NA 

Bei der Betrachtung, was die gleiche Linie sein sollte, in meine beiden data.frame und meine xts ich sehen kann, dass die Linien versetzt sind (ich das Datumsformat in der xts Objekterstellung geändert hatte):

> mesdonnees[25617,] 
        time value 
25617 08-11-2006 23:51  0 
> xtsdata[25617,] 
      [,1] 
2006-11-25 0.27 

Wie ist dass meine Daten verrechnet werden? Ich habe versucht, die tz zu ändern, aber es betrifft es nicht. Ich entfernte alle Duplikate mit der dyplr package, es hat auch keine Auswirkungen auf die XTS-Ergebnisse. Danke für Ihre Hilfe !


Nach meinem xts Code auf den von Joshua schlug einen Wechsel:

xtsdata <- xts(mesdonnees$value, order.by = as.POSIXct(mesdonnees$time, tz = "GMT", format = "%d-%m-%Y %H:%M")) 

... meine Daten zeigen, richtig für den „letzten“ Teil, aber ich habe jetzt ein anderes Problem. Die ersten 2300 Daten zeigen die folgenden Ergebnisse, wenn dabei (mit xtsdata[1500,] (oder jede Zeile < 2300) zeigt die gleichen Ergebnisse)

> view(xtsdata): 
0206-06-30 23:08:00 NA 
0206-06-30 23:18:00 NA 
0206-06-30 23:28:00 NA 
1900-01-04 12:00:00 NA 
2006-03-05 04:07:00 NA 
2006-03-05 04:17:00 NA 

ich diesen Fehler bemerkt vor und dachte, dass es auf das Datumsformat zurückzuführen war; vielleicht ist es nicht? Auch wenn bei den xtsdata Suche Ich habe nicht die gleichen Ergebnisse für die gleiche Zeile (die letzten Zeilen sind richtig Gedanken):

> mesdonnees[2360,] 
       time value 
2360 23-03-2006 03:09 NA 
> xtsdata[2360,] 
        [,1] 
2006-03-05 09:07:00 NA 

Wie gewünscht:

> str(mesdonnees) 
'data.frame': 32556 obs. of 2 variables: 
$ time : chr "05-03-2006 04:07" "05-03-2006 04:17" "05-03-2006 04:27" "05-03-2006 04:37" ... 
$ value: num NA NA NA NA NA NA NA NA NA NA ... 

Und wenn nötig:

+0

Bitte bearbeiten Sie die Ausgabe von 'str (mesdonnees)' in Ihre Frage. –

Antwort

0

Das Problem ist, dass Sie nur den Datumsteil des Zeitstempels in datetext und einschließen, aber Ihre Daten haben Daten und Zeiten.

Sie müssen auch nicht die ganze String-Teilmenge tun. Sie können dasselbe Ergebnis erzielen, indem Sie das Argument format in Ihrem as.POSIXct-Aufruf angeben.

xtsdata <- xts(mesdonnees$value, 
       as.POSIXct(mesdonnees$times, "GMT", format = "%d-%m-%Y %H:%M") 
+0

Hallo, Ihre Lösung arbeitete für den "letzten" Teil meiner Daten (die nicht in Daten umgewandelt wurden). Aber es funktioniert immer noch nicht für den Anfang des Datensatzes (Ich werde den Beitrag mit mehr Details bearbeiten) – legardien

+0

Das Problem ist, dass Ihre Termine in zwei (oder mehr?) Verschiedenen Formaten sind. Sie sollten den Aufruf 'as.POSIXct' durch' allowings jederzeit 'oder 'lubridate :: ymdhms' ersetzen. –

+0

Ja, ich habe nicht bemerkt, dass der ursprüngliche Datensatz ein falsches Datumsformat hatte; das Jahr ist falsch geschrieben ("206" statt "2006"). Vielen Dank für den Hinweis, Fall ist gelöst. – legardien