从data.frame中按时间标准选择数据的步骤
下午好!现在我想自动处理财务数据,但我遇到了一个问题,即如何从data.frame中选择所需的数据 例如,我有data.frame的以下头部: 这里主要关注的是第一列周期-数据的时间频率可以为1m,如下所示,1s、1h、1d。我想写一个包含参数频率的函数。例如,如果频率=2h,则函数输出为new data.frame,其中包含2h前观察到的股票价格:从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
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软件包应该会有所帮助。