Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从data.frame中按时间标准选择数据的步骤_R_Dataframe - Fatal编程技术网

从data.frame中按时间标准选择数据的步骤

从data.frame中按时间标准选择数据的步骤,r,dataframe,R,Dataframe,下午好!现在我想自动处理财务数据,但我遇到了一个问题,即如何从data.frame中选择所需的数据 例如,我有data.frame的以下头部: 这里主要关注的是第一列周期-数据的时间频率可以为1m,如下所示,1s、1h、1d。我想写一个包含参数频率的函数。例如,如果频率=2h,则函数输出为new data.frame,其中包含2h前观察到的股票价格: 2015-01-02 00:00:00 2015-01-02 02:00:00 2015-01-02 04:00:00 .... 如果频率为15

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

例如,我有data.frame的以下头部:

这里主要关注的是第一列周期-数据的时间频率可以为1m,如下所示,1s、1h、1d。我想写一个包含参数频率的函数。例如,如果频率=2h,则函数输出为new data.frame,其中包含2h前观察到的股票价格:

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。如何纠正

其次,f.e.我将获得频率=5m,但我的数据频率为1m,因此我需要更正我的表格,只保留第一、第六、第十一。。。排。我怎样才能做到? 谢谢
以下是一种可能的解决方案:

  # 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")

以下是一种可能的解决方案:

  # 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")

对于您的输出,如果您选择频率=5分钟,您希望获得平均值,即输出将是该时段的平均出价高,等等,还是希望获得该时刻的准确值?这两种方法都是可行的,但根据您的输入数据,您可能没有某些瞬间的值。不,如果频率=5分钟,但我的数据每分钟都有观测值,我希望得到新的数据帧,其中旧数据将为:数据[1],数据[6],数据[11],等等。因此,不要使用步骤=5观测值编号2-5。好的。对于初始时间步长频率,您可以使用difftimetime[1],time[2],units=mins,这样您就知道单位是分钟,对于其余的,lubridate软件包应该会有所帮助。对于您的输出,如果您选择frequency=5分钟,您希望获得平均值,即输出将是该时期的平均出价高值等,还是希望获得该时刻的准确值?这两种方法都是可行的,但根据您的输入数据,您可能没有某些瞬间的值。不,如果频率=5分钟,但我的数据每分钟都有观测值,我希望得到新的数据帧,其中旧数据将为:数据[1],数据[6],数据[11],等等。因此,不要使用步骤=5观测值编号2-5。好的。对于初始时间步长频率,您可以使用difftimetime[1],time[2],units=mins,这样您就知道单位是分钟,对于其余的,lubridate软件包应该会有所帮助。