Ich habe einen Charaktervektor mit Daten in verschiedenen Formaten wie diesem
%Vor%Ich möchte diese in Daten konvertieren. Ich habe das sehr gute dmy aus dem lubridate-Paket ausprobiert, aber das geht nicht:
%Vor%Es behandelt das / 12 Jahr, als ob es 0012 ist.
Also versuche ich jetzt den regulären Ausdruck, um jeden Typ auszuwählen und einzeln mit as.Date () in Daten zu konvertieren. Der reguläre Ausdruck, den ich versucht habe, dd / mm / yy auszuwählen, funktioniert jedoch nicht.
%Vor%gibt
zurück %Vor%Ich dachte, dass die {2,2} genau zwei Zahlen bekommen sollte und nicht alle. Ich bin nicht sehr gut im regulären Ausdruck, daher wird jede Hilfe geschätzt.
Danke
BEARBEITEN
Was ich tatsächlich habe, sind drei verschiedene Arten von Datum wie unten
%Vor%Und ich möchte diese in Daten umwandeln
%Vor%gibt mir
%Vor%Das ist jedoch falsch und 0012 sollte 2012 sein. Ich möchte (eine ziemlich einfache) Lösung für dieses Problem.
Eine Lösung, die ich jetzt (dank @ Plannapus) habe, ist die Verwendung regulärer Ausdrücke Am Ende habe ich diese Funktion erstellt, da ich immer noch einige Fälle bekam, in denen der Lubridate-Ansatz 12 zu 0012 wurde
%Vor%Aber das ist nicht sehr elegant. Gibt es bessere Lösungen?
Sie können parse_date_time
von lubridate
:
Beachten Sie jedoch, dass die Reihenfolge des Formats wichtig ist:
%Vor%BEARBEITEN
Intern verwendet parse_date_time
guess_formats
(was vermutlich einige reguläre Ausdrücke verwendet):
Wie im Kommentar erwähnt, können Sie parse_date_time
wie folgt verwenden:
Sie können das Format basierend auf der Eingabedauer des Datums auswählen.
%Vor% Nach Ihrem ursprünglichen Versuch %%_co_de% basierter Lösungen können Sie regex
mit diesem gsub
versuchen und dann in ein beliebiges Datum / Uhrzeit-Format umwandeln, das Sie wünschen ...
Wenn du es wirklich in regexp machen wolltest, hättest du $
benutzen sollen, um anzuzeigen, dass nach den letzten zweistelligen Zahlen nichts (also Ende der Zeichenkette) war:
Ansonsten können Sie zusätzlich zu den anderen Antworten einen Blick auf hier und hier für andere Möglichkeiten zur Verarbeitung mehrerer Datumsformate.
Hier ist ein Basis-R-Weg für den allgemeineren Fall, der (noch) nicht in den nicht akzeptierten Antworten behandelt wird.
%Vor%Sehen Sie sich die %code% struct:
an %Vor%Aufgrund der Ausrichtung der Datenstruktur kann die Adresse von %code% gezwungen sein, sich an die Adresse eines Vielfachen der Wortgröße anzupassen. Daher werden mehrere nicht verwendete Bytes zwischen %code% und %code% aufgefüllt. Das sind die Bytes, die nicht initialisiert und somit von Valgrind gemeldet wurden.
Um das Problem zu umgehen, könnten Sie das Initialisieren der gesamten Struktur durch %code% erzwingen.
%Vor%Obwohl @timrau ziemlich genau beschrieben hat, was das Kernproblem hier ist (Ausrichtung / Packen), bin ich kein Fan der vorgeschlagenen Lösung.
Sie haben eine %code% in Ihrem Code als %code% und %code% beschrieben. Die Größe der tatsächlichen Datenstruktur im Speicher ist jedoch nicht %code% , und das ist das Kernproblem.
Die vorgeschlagene Lösung schlägt vor, einfach alle Bits der %code% -Struktur zu löschen, bevor die wichtigen Bits eingefügt werden. Das Problem, das ich damit habe, ist sowohl ein semantischer als auch ein technischer - die Größe der Datenstruktur, die über den Draht gesendet wird, ist keine genaue Darstellung dessen, was Sie im Code modelliert haben. Mit anderen Worten, Sie senden nicht nur eine %code% und eine %code% - Sie senden eine %code% , eine %code% und einige andere cruft (padding).
Mein Vorschlag ist es, den Crust loszuwerden und nur das zu senden, was Sie in Ihrem Code modelliert haben.
Es gibt keine direkte Unterstützung in C ++, um Ausrichtung und Auffüllung auszuschalten, aber alle mir bekannten Compiler bieten einen einfachen Mechanismus, um Datenstrukturen auf %code% bytes auszurichten:
%Vor%Dadurch wird die %code% -Datenstruktur genau , was Sie in Ihrem Code modelliert haben, ohne Auffüllung. Dadurch wird %code% unnötiger Zugriff und Sie senden genau %code% byte über die Verbindung.
Ich habe Valgrind verwendet, um nach Speicherlecks in meinem Code zu suchen. Obwohl keine Speicherlecks gefunden werden, werden einige Fehler gemeldet, die alle auf einer einzigen Funktion / Klassenmethode beruhen:
%Vor%Das %code% , auf das die Fehler zeigen, ist Teil von %code% class:
%Vor%Ich sehe nicht, was das Problem ist. Wo genau sind die nicht initialisierten Werte? Oder sollte ich einfach die von Valgrind gemeldeten Fehler ignorieren?