2013-06-06 12 views
5

dataframe nazwie D zawiera te dane:Konwersja obiektu XTS do użytecznego ramki danych

timestamp,value 
"2013-06-02 00:00:00",70 
"2013-06-02 00:02:00",70 
"2013-06-02 00:07:00",60 
"2013-06-02 00:15:00",70 
"2013-06-02 00:12:00",60 
"2013-06-02 00:30:00",70 
"2013-06-02 00:45:00",70 
"2013-06-02 01:00:00",70 

Kod mam to:

d = read.csv(path, header=TRUE, sep=",") 
d2 <- xts(x = d[c("value")], order.by = as.POSIXct(d[, "timestamp"], tz = "GMT", format = "%Y-%m-%d %H:%M:%S")) 
ends <- endpoints(d2, on = "minutes", k = 15) 
d3 <- period.apply(d2, ends, mean) 

Potem chcesz przekonwertować XTS sprzeciw wobec dataframe i używam to:

d3$timestamp = rownames(d3) 
rownames(d3) = NULL 
d3$timestamp = strptime(d3$timestamp, "%Y-%m-%d %H:%M:%S") 

jednak w ostatnim kroku drukuje błąd to:

Error in NextMethod(.Generic) : 
    number of items to replace is not a multiple of replacement length 

Jak obserwuję wpisując d3 po poleceń cały obiekt ma ten format danych:

      timestamp 
2013-06-02 00:15:00  65 
2013-06-02 00:30:00  70 
2013-06-02 00:45:00  70 
2013-06-02 01:00:00  70 

Jednak w nazwie kolumny musi mieć wartość nazwisko i jako drugiej kolumnie mają timestamp jak here. Co może być nie tak?

Prawo wyjście musi być to:

 value 
     65 2013-06-02 00:15:00 
     70 2013-06-02 00:30:00 
     70 2013-06-02 00:45:00 
     70 2013-06-02 01:00:00 

Odpowiedz

9

Można tworzyć data.frame tak na przykład:

data.frame(value=coredata(d3),timestamp=index(d3)) 
# value   timestamp 
# 1 65 2013-06-02 00:12:00 
# 2 70 2013-06-02 00:15:00 
# 3 70 2013-06-02 00:30:00 
# 4 70 2013-06-02 00:45:00 
# 5 70 2013-06-02 01:00:00 

Radzę również użyć read.zoo czytać dane jako zoo i unikaj ręcznego wymuszania xts. Np

dat <- read.zoo(text='timestamp,value 
"2013-06-02 00:00:00",70 
"2013-06-02 00:02:00",70 
"2013-06-02 00:07:00",60 
"2013-06-02 00:15:00",70 
"2013-06-02 00:12:00",60 
"2013-06-02 00:30:00",70 
"2013-06-02 00:45:00",70 
"2013-06-02 01:00:00",70',tz ='' , format = "%Y-%m-%d %H:%M:%S",header=TRUE, 
     sep=',') 
d2 <- as.xts(dat) 
1

Innym rozwiązaniem jest pakiet tidyquant które w dwóch funkcji użytecznych dla wymuszenia (konwersja) ramki danych do i od XT przedmiotów, a mianowicie as_xts() do przetwarzania ramki danych do XTS i as_tibble() do przekształcania XT (i inne serie czasowe lub obiekty macierzy), aby "uporządkować" ramki danych.

Oto krótki przykład. Używam funkcji tribble() do odtworzenia Twojego przykładu. Podczas procesu konwersji korzystam z funkcji as_datetime() z lubridate (tidyquant ładuję to automatycznie), aby przekonwertować z klasy postaci na datę i godzinę. Wszystko inne powinno być całkiem proste.


library(tidyquant) 

# Recreate data frame 
data_df <- tribble(
    ~timestamp, ~value, 
    "2013-06-02 00:00:00", 70, 
    "2013-06-02 00:02:00", 70, 
    "2013-06-02 00:07:00", 60, 
    "2013-06-02 00:15:00", 70, 
    "2013-06-02 00:12:00", 60, 
    "2013-06-02 00:30:00", 70, 
    "2013-06-02 00:45:00", 70, 
    "2013-06-02 01:00:00", 70 
) 
data_df 
#> # A tibble: 8 × 2 
#>    timestamp value 
#>     <chr> <dbl> 
#> 1 2013-06-02 00:00:00 70 
#> 2 2013-06-02 00:02:00 70 
#> 3 2013-06-02 00:07:00 60 
#> 4 2013-06-02 00:15:00 70 
#> 5 2013-06-02 00:12:00 60 
#> 6 2013-06-02 00:30:00 70 
#> 7 2013-06-02 00:45:00 70 
#> 8 2013-06-02 01:00:00 70 

# Convert data frame to xts 
data_xts <- data_df %>% 
    mutate(timestamp = as_datetime(timestamp, tz = Sys.timezone())) %>% 
    as_xts(date_col = timestamp) 
data_xts 
#>      value 
#> 2013-06-02 00:00:00 70 
#> 2013-06-02 00:02:00 70 
#> 2013-06-02 00:07:00 60 
#> 2013-06-02 00:12:00 60 
#> 2013-06-02 00:15:00 70 
#> 2013-06-02 00:30:00 70 
#> 2013-06-02 00:45:00 70 
#> 2013-06-02 01:00:00 70 

# Convert xts to data frame 
data_df_2 <- data_xts %>% 
    as_tibble(preserve_row_names = TRUE) %>% 
    rename(timestamp = row.names) %>% 
    mutate(timestamp = as_datetime(timestamp, tz = Sys.timezone())) 
data_df_2 
#> # A tibble: 8 × 2 
#>    timestamp value 
#>    <dttm> <dbl> 
#> 1 2013-06-02 00:00:00 70 
#> 2 2013-06-02 00:02:00 70 
#> 3 2013-06-02 00:07:00 60 
#> 4 2013-06-02 00:12:00 60 
#> 5 2013-06-02 00:15:00 70 
#> 6 2013-06-02 00:30:00 70 
#> 7 2013-06-02 00:45:00 70 
#> 8 2013-06-02 01:00:00 70 
+0

Zauważ, że 'timetk :: tk_xt()' i 'timetk :: tk_tbl()' 'tidyquant wymieniasz :: as_xts()' i 'tidyquant :: as_tibble()' . Przejdź do pakietu 'timetk' dla tych operacji koercji. –

Powiązane problemy