2016-11-25 71 views
0

NA处理我有格式的时间序列数据时间序列数据汇总和,使用R

     Ask Bid Trade Ask_Size Bid_Size Trade_Size 
2016-11-01 01:00:03  NA 938.10  NA  NA  203   NA 
2016-11-01 01:00:04  NA 937.20  NA  NA  100   NA 
2016-11-01 01:00:04 938.00  NA  NA  28  NA   NA 
2016-11-01 01:00:04  NA 938.10  NA  NA  203   NA 
2016-11-01 01:00:04 939.00  NA  NA  11  NA   NA 
2016-11-01 01:00:05  NA 938.15  NA  NA  19   NA 
2016-11-01 01:00:06  NA 937.20  NA  NA  100   NA 
2016-11-01 01:00:06 938.00  NA  NA  28  NA   NA 
2016-11-01 01:00:06  NA  NA 938.10  NA  NA   69 
2016-11-01 01:00:06  NA  NA 938.10  NA  NA  831 
2016-11-01 01:00:06  NA 938.10  NA  NA  134   NA 

的时间序列数据的结构

str(df_ts) 

An ‘xts’ object on 2016-11-01 01:00:03/2016-11-02 12:59:37 containing: 
    Data: num [1:35797, 1:6] NA NA 938 NA 939 NA NA 938 NA NA ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:6] "Ask" "Bid" "Trade" "Ask_Size" ... 
    Indexed by objects of class: [POSIXct,POSIXt] TZ: 
    xts Attributes: 
NULL 

我试图汇总数据每1分钟使用下面的代码

# Creating a Function 
apply.periodly <- function (x, FUN, period, k = 1, ...) 
{ 
    if (!require("xts")) { 
    stop("Need 'xts'") 
    } 
    ep <- endpoints(x, on = period, k=k) 
    period.apply(x, ep, FUN, ...) 
} 

# Aggregation every minute 

df_aggregate_min <- apply.periodly(x = df_ts, FUN = mean, period = "minutes", k = 1) 

但由于数据“NA”错误输出。 如何通过忽略NA来每隔一分钟汇总一次列?

+0

定制意味着功能('naMean < - 函数(X){均值(X,na.rm = TRUE)}')在最后一行应该做的伎俩 – TBSRounder

+0

谢谢,但所产生的输出是意味着整个专栏,我希望每分钟都能得到专栏的总和。我使用的代码是df_aggregate_min < - apply.periodly(x = df_ts,FUN = naMean,period =“minutes”,k = 1) – Abhishek

回答

0

这是两个单列:

library(readr) 
library(xts) 
library(lubridate) 
Sys.setenv(TZ = "UTC") 
# hack: in-place edit of infile Sample_HFT.csv 
# replace first comma with "T" to create ISO-datetime strings 
# do this only ONCE! 
system('perl -pi -E "s/,/T/" Sample_HFT.csv') 

hft <- read_csv("Sample_HFT.csv", col_names = TRUE) 
head(hft) 

hft.xts <- as.xts(hft[, -1], order.by = ymd_hms(hft$T)) 
indexFormat(hft.xts) <- "%y-%m-%d %H:%M:%S" 

my.cummean <- function(x) { 
    x2 <- x 
    cummeans <- cumsum(x2[!is.na(x)])/seq_along(x2[!is.na(x)]) 
    cummeans[endpoints(cummeans, "minutes"),] 
} 

ask_minutes <- split(hft.xts$Ask, f = "minutes") 
ask_minutes_cum <- lapply(ask_minutes, my.cummean) 
ask_minutes_mean <- do.call("rbind", ask_minutes_cum) 

trade_size_minutes <- split(hft.xts$Trade_Size, f = "minutes") 
trade_size_minutes_cum <- lapply(trade_size_minutes, my.cummean) 
trade_size_minutes_mean <- do.call("rbind", trade_size_minutes_cum) 

我仍然不知道这是否是预期的商业逻辑,但我认为你可以计算的细节了。

head(trade_size_minutes_mean) 
        Trade_Size 
16-11-01 01:00:35 194.500 
16-11-01 01:01:59  59.909 
16-11-01 01:02:48  5.875 
16-11-01 01:03:34  6.000 
16-11-01 01:08:57  3.889 
16-11-01 01:09:29  1.682 
+0

请帮忙。上述方法不起作用。共享数据示例的链接https://www.dropbox.com/s/m94y6pbhjlkny1l/Sample_HFT.csv?dl=0 – Abhishek

+0

我已更新我的答案。你可以把问题主体中的示例文件链接?读者可能更愿意在R代码中提供解决方案。 – knb