2017-07-29 6 views
2

Ich habe eine regelmäßige 5-Minuten-Intervall Datetime Datensätze (ca. 50). POSIXt/ lubridate Funktionen konvertieren meine Datetime sehr schön in ein 24-Stunden-Format wie erforderlich. Aber ich würde gerne eine weitere Spalte mit der Definition meines Tages hinzufügen, die von 6 Uhr morgens bis 6 Uhr morgens ist (was momentan Mitternacht bis Mitternacht ist). Ich versuche dies zu tun, um nach 12 Uhr Aktivität als Teil des aktuellen Datums statt als nächstes zu erfassen.Datum/Tag Manipulation in R

Ich versuche derzeit, jede 288. Zeile eine Gruppe zu erstellen (es gibt 288 5 Minuten-Intervalle pro Tag). Aber es schafft ein Problem, weil meine Datensätze nicht unbedingt zu einem bestimmten Zeitpunkt starten.

Ich möchte keine Offsets erstellen, weil das die Werte manipuliert, die der Zeit entsprechen.

Haben Sie eine effiziente Lösung für dieses Problem? Vielen Dank.

+0

Nicht sicher, was Sie mit "Ich möchte keine Offsets erstellen" meinen. Würde das Ihren Bedürfnissen entsprechen? 'Bibliothek (ordentlich); seq (as.POSIXct (Sys.time()), von = "5 min", length.out = 50 * 288)%>% as_data_frame()%>% mutiere (my_day = as.Date (value-as. difftime (6, units = "hours"))) ' – dmi3kno

Antwort

1

Sie können tun es effizient, indem zuerst ein seq uss Datum/Zeit zu erzeugen, dann cut mit dem Behälter zu finden, in der jeder Wert fällt:

set.seed(2) 
dat <- Sys.time() + sort(runif(10, min=0, max=5*24*60*60)) 
dat 
# [1] "2017-07-29 15:43:10 PDT" "2017-07-29 20:23:12 PDT" "2017-07-29 22:24:22 PDT" "2017-07-31 08:22:57 PDT" 
# [5] "2017-07-31 18:13:06 PDT" "2017-07-31 21:01:10 PDT" "2017-08-01 12:30:19 PDT" "2017-08-02 04:14:03 PDT" 
# [9] "2017-08-02 17:26:14 PDT" "2017-08-02 17:28:52 PDT" 
sixs <- seq(as.POSIXct("2017-07-29 06:00:00", tz = "UTC"), as.POSIXct("2017-08-03 06:00:00", tz = "UTC"), by = "day") 
sixs 
# [1] "2017-07-29 06:00:00 UTC" "2017-07-30 06:00:00 UTC" "2017-07-31 06:00:00 UTC" "2017-08-01 06:00:00 UTC" 
# [5] "2017-08-02 06:00:00 UTC" "2017-08-03 06:00:00 UTC" 
cut(dat, sixs, label = FALSE) 
# [1] 1 1 1 3 3 3 4 5 5 5 

Nach der Hilfeseite (?seq.POSIXt), Sie könnte stattdessen by="DSTday" wählen.

1

Da ich nicht kommentieren kann (Reputationsproblem, neuer Kollege hier), poste ich dies als Antwort.
Überprüfen Sie diese Frage und die entsprechende Antwort: How to manipulate the time part of a date column?

Es veranschaulicht eine robustere Lösung, wie es unabhängig von Ihrer Datenstruktur (z. B. Wiederholung) ist.

Nach @meenaparam ‚s Lösung:

konvertiert alle Datumsspalte zu dmy_hms Format von lubridate Paket. Bitte erkunden Sie andere Optionen wie dmy_hm oder ymd_hms etc, je nach Ihren spezifischen Bedürfnissen.

mutate(DATE = dmy_hms(DATE)) 

Jetzt erstellen Sie eine Spalte, um die Datenpunkte zu identifizieren, die auf verschiedene Arten geändert werden müssen. Wie Ihre Datenpunkte mit 00:00:00 bis 05:59:59 (hms) müssen Teil des vorherigen Datums sein.

DAY_PAST = case_when(hour(DATE) < 6 ~ "yup", TRUE ~ "nope")) 

nun den day Wert dieser "yup" Daten day(DATE)-1

NEW_DATE = case_when(DAY_PAST == "yup" 
     ~ make_datetime(year(DATE-86400), month(DATE-86400), day = day(DATE-86400), hour = hour(DATE)), 
     TRUE ~ DATE) 

Hoffnung wandeln das Ihr Problem löst.

+0

danke, funktioniert super! –

+0

Es hätte 'NA'-Ergebnisse für den Monat Start-Eingänge erstellt, ich habe den Code aktualisiert. Und akzeptiere bitte meine Antwort, wenn es für dich funktioniert hat. Es wird dann meine erste akzeptierte Antwort sein. :) – Arani