R编程过滤带日期列的数据框

时间:2018-08-15 22:38:21

标签: r

对于这样的数据框,我试图在特定日期范围内选择一些行:

nasdaq=read.csv("nasdaq.csv")
head(nasdaq)

        Date Close.Price
1 2013-08-05     3692.95
2 2013-08-06     3665.77
3 2013-08-07     3654.01
4 2013-08-08     3669.12
5 2013-08-09     3660.11
6 2013-08-12     3669.95

到目前为止我尝试过的是:

chunk=subset(nasdaq,nasdaq$Date>=as.Date("2013-08-05") & nasdaq$Date<=as.Date("2018-08-03"))

警告消息:

1: In eval(e, x, parent.frame()) :
  Incompatible methods ("Ops.factor", "Ops.Date") for ">="
2: In eval(e, x, parent.frame()) :
  Incompatible methods ("Ops.factor", "Ops.Date") for "<="

我也尝试过...

 chunk=nasdaq[nasdaq$Date>=as.Date("2013-08-05") & nasdaq$Date<=as.Date("2018-08-03"),]

警告消息:

1: In `[.data.frame`(nasdaq, nasdaq$Date >= as.Date("2013-08-05") &  :
  Incompatible methods ("Ops.factor", "Ops.Date") for ">="
2: In `[.data.frame`(nasdaq, nasdaq$Date >= as.Date("2013-08-05") &  :
  Incompatible methods ("Ops.factor", "Ops.Date") for "<="

我在没有as.Date函数的情况下都尝试了上述两种方法,但是无法正常工作,请告知我哪里可能出问题了?

3 个答案:

答案 0 :(得分:1)

警告消息告诉您问题所在。数据框中的Date列是一个因素,而不是日期。这是因为您没有在stringsAsFactors = FALSE中指定read.csv(然后Date将是一个字符)。

有几种方法可以解决此问题。您可以在读取数据后将其转换为日期:

nasdaq$Date <- as.Date(nasdaq$Date, "%Y-%m-%d")

或者在读取文件时可以使用colClasses参数:

nasdaq <- read.csv("nasdaq.csv", header = TRUE, colClasses = c("Date", "numeric"))

或者您可以使用readr::read_csv,它将识别出该列包含日期。

答案 1 :(得分:0)

这应该对您有用,

library(dplyr)
library(lubridate)

# dummmy data
test_data <- data.frame(
  Date = ymd(c("2013-08-05","2013-08-06 ","2013-08-07")),
  Close.Price = c(3692.95,3665.77,3654.01)
)

test_data %>%
  filter(Date >= ymd("2013-08-05") & Date <= ymd("2013-08-07"))

        Date Close.Price
1 2013-08-05     3692.95
2 2013-08-06     3665.77
3 2013-08-07     3654.01

答案 2 :(得分:0)

您需要先在as.Date()函数中指定日期字符串的格式,然后才能在子集函数中使用它

nasdaq$Date <- as.Date(nasdaq$Date, format = "%Y-%m-%d")
chunk <- subset(nasdaq,nasdaq$Date >= "2013-08-05" & nasdaq$Date <= "2018-08-03")