【问题标题】:to select data by time criteria from data.frame从 data.frame 中按时间标准选择数据
【发布时间】:2017-11-25 16:17:51
【问题描述】:

下午好!现在我想自动处理财务数据,但我遇到了如何从 data.frame 中选择所需数据的问题。

比如我有以下headof data.frame

               period bid_open bid_high bid_low bid_close ask_open ask_high 
1 2015-01-02 00:00:00  1.20860  1.20880 1.20860   1.20870  1.20890  1.20890 
2 2015-01-02 00:01:00  1.20870  1.20880 1.20865   1.20865  1.20880  1.20890 
3 2015-01-02 00:02:00  1.20865  1.20880 1.20865   1.20875  1.20875  1.20885 
4 2015-01-02 00:03:00  1.20875  1.20885 1.20875   1.20885  1.20885  1.20900 
5 2015-01-02 00:04:00  1.20885  1.20885 1.20880   1.20880  1.20895  1.20895 
6 2015-01-02 00:05:00  1.20880  1.20885 1.20880   1.20880  1.20890  1.20895 

这里主要关注第一列period——数据可以有时间频率1m(如下)、1s、1h、1d。我想编写包含参数frequency 的函数。例如,如果 frequency=2h,函数输出是新的 data.frame,其中包含 2 小时前的观察(股票价格):

2015-01-02 00:00:00
2015-01-02 02:00:00
2015-01-02 04:00:00
....

如果频率为15s (f.e.),则 R 必须输出初始数据帧,因为初始数据的频率为 1m。

但我有几个问题要完成这项任务。你能帮帮我吗?

我的逻辑是:

首先,找到初始频率:

    time=data[,1]
freq=as.numeric(difftime(time[2], time[1]))

但问题是 R 只显示数字(在本例中为 freq=1),我不知道它是 1m 还是 1h 还是 1d。如何纠正?

  1. 其次,f.e.我将获得freq=5m,但我的数据频率是1m,所以我需要更正我的表并只保留1st,6th,11th... 行。我怎样才能做到? 谢谢!

【问题讨论】:

  • 对于您的输出,如果您选择频率 = 5 分钟,您想要获得平均值(即输出将是该时期的平均出价高点等)还是您想要确切的值在那一刻?两者都是可行的,但根据您的输入数据,您可能在某些瞬间没有值。
  • 不,如果频率=5分钟,但我的数据每分钟都有观察,我想得到新的数据框,旧数据将是:data[1,],data[6 ,],data[11,] 等,因此 step = 5(不使用 2-5 号观测值)。
  • 好的。对于初始时间步(频率),您可以使用difftime(time[1], time[2], units = "mins"),这样您就知道单位是分钟,对于其余的,lubridate 包应该会有所帮助。

标签: r dataframe


【解决方案1】:

这是一种可能的解决方案:

  # 1. Load library
  library(dplyr)

   # 2. Data set sample
   df <- data.frame(
      period = c("2015-01-02 00:00:00", "2015-01-02 00:01:00", "2015-01-02 00:02:00", "2015-01-02 00:03:00", "2015-01-02 00:04:00", "2015-01-02 00:05:00"),
      bid_open = c(1.20860, 1.20870, 1.20865, 1.20875, 1.20885, 00:05:00))

    # 3. Feature engineering
   df <- df %>% mutate(
     year = as.numeric(substr(period, 1, 4)),
     month = as.numeric(substr(period, 6, 7)),
     day = as.numeric(substr(period, 9, 10)),
     hour = as.numeric(substr(period, 12, 13)),
     min = as.numeric(substr(period, 15, 16)),
     sec = as.numeric(substr(period, 18, 19)))

  # 4. Select data function
  select_data <- function(df, str_frequency){

     # 1. Define frequency parameters
     frequency_value <- as.numeric(substr(str_frequency, 1, 2))
     frequency_type <- substr(str_frequency, 3, nchar(str_frequency))

     # 2. Calculate result by using modulus operator %%
     df_result <- df[!(df[, c(frequency_type)] %% frequency_value), ]

     # 3. Return result
     return(df_result)
  }

# 5. Test (filter for "02min" as a basic test)
select_data(df, "01year")
select_data(df, "01month")
select_data(df, "01day")
select_data(df, "01hour")
select_data(df, "02min") # should filter here / change to "03min" also works
select_data(df, "01sec")

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2013-10-28
    • 2014-05-22
    相关资源
    最近更新 更多