2017-03-14 8 views
0

Ich habe einen tibble mit einer Datumsspalte:Datetime-Spalte Spalte von Teilen zur Liste

df <- structure(list(date = structure(c(1489494191.81966, 1489494125.153, 
    1489494058.48633, 1489493991.81966, 1489493925.153, 1489493858.48633, 
    1489493791.81966, 1489493725.153, 1489493658.48633, 1489493591.81966 
    ), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = "date", class = c("tbl_df", 
    "tbl", "data.frame"), row.names = c(NA, -10L)) 

df 

# A tibble: 10 × 1 
        date 
       <dttm> 
1 2017-03-14 13:23:11 
2 2017-03-14 13:22:05 
3 2017-03-14 13:20:58 
4 2017-03-14 13:19:51 
5 2017-03-14 13:18:45 
6 2017-03-14 13:17:38 
7 2017-03-14 13:16:31 
8 2017-03-14 13:15:25 
9 2017-03-14 13:14:18 
10 2017-03-14 13:13:11 

dem Ich mag würde mit Listen der Teile eine Listenspalte tranform in in (Jahr, Monat, Tag, Stunde , Minuten, Sekunden), so etwas wie:

# A tibble: 10 × 1 
        result 
        <list> 
1 list(2017,3,14,13,23,11) 
2 list(2017,3,14,13,22,5) 
3 list(2017,3,14,13,20,58) 
4 list(2017,3,14,13,19,51) 
5 list(2017,3,14,13,18,45) 
6 list(2017,3,14,13,17,38) 
7 list(2017,3,14,13,16,31) 
8 list(2017,3,14,13,15,25) 
9 list(2017,3,14,13,14,18) 
10 list(2017,3,14,13,13,11) 

ich habe eine Reihe von String-Split-Strategien versucht, aber sie sind sehr ineffizient (tatsächliche df ist massiv). Die Komponenten der Liste müssen am Ende ganzzahlig oder numerisch sein.

Gibt es einen cleveren Weg?

EDIT:

Dies ist, was ich jetzt tue, aber es scheint nicht so gut zu skalieren:

library(lubridate) 
library(purrr) 

df %>% 
    transmute(y = year(date), 
      m = month(date), 
      d = day(date), 
      hh = hour(date), 
      mm = minute(date), 
      ss = second(date) 
     ) %>% 
    by_row(c, .to = "result") %>% 
    select(result) 

# A tibble: 10 × 1 
     result 
     <list> 
1 <list [6]> 
2 <list [6]> 
3 <list [6]> 
4 <list [6]> 
5 <list [6]> 
6 <list [6]> 
7 <list [6]> 
8 <list [6]> 
9 <list [6]> 
10 <list [6]> 
+1

Ich denke, 'df $ res <- strsplit (as.character (df $ date)," | - |: ")' könnte ein Anfang sein –

Antwort

0

können Sie verwenden library(lubridate):

library(lubridate) 

y <- year(df$date) 
m <- month(df$date) 
d <- day(df$date) 
h <- hour(df$date) 
min <- minute(df$date) 
s <- as.integer(second(df$date)) 

und dann zu einer Liste kombinieren.

res <- lapply(1:length(y), function(x){ 

    return(c(y[x], d[x], d[x], h[x], min[x], s[x])) 

}) 

tibble::tibble(res) 
0

Sie können es mit data.table wie in einer Zeile Code tun:

DT[, unclass(as.POSIXlt(date))][, .(year+1900, mon, mday, hour, min, sec)]

Konvertieren Sie Ihre data.frame-data.table und das Datum POSIXlt Format.

DT <- as.data.table(df) 
DT[, unclass(as.POSIXlt(date))][, ':=' (year=year+1900, mon=mon+1, sec=floor(sec)) ][, .(year, mon, mday, hour, min, sec)] 

Dieser Ketten die Operationen so das Ergebnis wie folgt aussieht:

year mon mday hour min sec 
1: 2017 3 14 7 23 11 
2: 2017 3 14 7 22 5 
3: 2017 3 14 7 20 58 
4: 2017 3 14 7 19 51 
5: 2017 3 14 7 18 45 
6: 2017 3 14 7 17 38 
7: 2017 3 14 7 16 31 
8: 2017 3 14 7 15 25 
9: 2017 3 14 7 14 18 
10: 2017 3 14 7 13 11 

Dies ist wahrscheinlich der schnellste Weg in R zu Millionen von Datensätzen zu verarbeiten, um das Datum in der Art und Weise aufteilen Sie bestimmt.

Verwandte Themen