该图显示了实际已删除的空日期

时间:2020-03-02 03:45:04

标签: r date plot time

我有股票数据,我已经缩短了R的时间范围,但是当我绘制图表时,图表仍然显示空白值和我删除的日期。我还试图让R读取我的date列作为日期,但是它不起作用。当我尝试运行ACF和线性模型时,我注意到日期存在问题。

> sp<-read.csv(file="~/Desktop/SP500.csv", header=T, sep=",",check.names=FALSE)
> sfshort=sp[1428:2049,]
> plot(sfshort)
> sfshort
           Date   Value
1428 2005-01-07 1186.19
1429 2005-01-14 1184.52
1430 2005-01-21 1167.87
1431 2005-01-28 1171.36
1432 2005-02-04 1203.03
1433 2005-02-11 1205.30
1434 2005-02-18 1201.59
1435 2005-02-25 1211.37
1436 2005-03-04 1222.12
1437 2005-03-11 1200.08
1438 2005-03-18 1189.65
1439 2005-03-24 1171.42
1440 2005-04-01 1172.92
1441 2005-04-08 1181.20
1442 2005-04-15 1142.62

上面列出了前几点。这是我用来尝试转换日期列的代码。我已经在较旧的项目中使用了此功能,所以我不确定为什么它不起作用。

 sfshort <- as.Date(spfshort$Date, "%m/%d/%y")

我的excel文件中的日期被列为MM / DD / YYYY。 这是我运行线性模型时所看到的。

> lm(sfshort$Value~sfshort$Date)

Call:
lm(formula = sfshort$Value ~ sfshort$Date)

Coefficients:
           (Intercept)  sfshort$Date2005-01-14  sfshort$Date2005-01-21  
               1186.19                   -1.67                  -18.32  
sfshort$Date2005-01-28  sfshort$Date2005-02-04  sfshort$Date2005-02-11  
                -14.83                   16.84                   19.11  

1 个答案:

答案 0 :(得分:0)

绘图问题是由于“日期”列最有可能属于"factor"类。如评论中所述,您需要转换为日期,或者甚至最好转换为POSIXlt。在这里,我建议使用strptime。 (或者在读取数据时立即执行。)

这是一个小示范。我读了您的示例数据文本,它与read.csv相似。为了进行比较,我将创建三个数据集sfshort.1sfshort.2sfshort.3

sfshort.1 <- read.table(text=
"          Date   Value
1428 2005-01-07 1186.19
1429 2005-01-14 1184.52
1430 2005-01-21 1167.87
1431 2005-01-28 1171.36
1432 2005-02-04 1203.03
1433 2005-02-11 1205.30
1434 2005-02-18 1201.59
1435 2005-02-25 1211.37
1436 2005-03-04 1222.12
1437 2005-03-11 1200.08
1438 2005-03-18 1189.65
1439 2005-03-24 1171.42
1440 2005-04-01 1172.92
1441 2005-04-08 1181.20
1442 2005-04-15 1142.62")

现在,由于它既不是整数也不是浮点数,因此默认情况下,Date列将作为因子读取:

str(sfshort.1)
# 'data.frame': 15 obs. of  2 variables:
# $ Date : Factor w/ 15 levels "2005-01-07","2005-01-14",..: 1 2 3 4 5 6 7 8 9 10 ...
# $ Value: num  1186 1185 1168 1171 1203 ...

因子levels应该与unique日期相同。

identical(unique(as.character(sfshort.1$Date)), levels(sfshort.1$Date))
# [1] TRUE

让我们删除第一行,看看会发生什么。

sfshort.2 <- sfshort.1[-1, ]
identical(unique(as.character(sfshort.2$Date)), levels(sfshort.2$Date))
# [1] FALSE

因子水平不变(并且所有将出现在图中)

现在,让我们将“日期”列转换为类POSIXlt

sfshort.3 <- transform(sfshort.2, Date=strptime(Date, "%Y-%m-%d"))

str(sfshort.3)
# 'data.frame': 14 obs. of  2 variables:
# $ Date : POSIXlt, format: "2005-01-14" "2005-01-21" "2005-01-28" "2005-02-04" ...  ## <- CHANGED!
# $ Value: num  1185 1168 1171 1203 1205 ...

并绘制所有三个版本:

op <- par(mfrow=c(2, 2))
plot(sfshort.1, main="sfshort.1", border=c(2, rep(1, 14)))
plot(sfshort.2, main="sfshort.2")
plot(sfshort.3, main="sfshort.3")
par(op)

enter image description here

我们可以看到sfshort.2仍然显示"2005-01-07",尽管它已被删除。在sfshort.3中,该问题已消除,并且数据已正确识别为日期。

请注意,在lm中,您需要执行以下操作,再次将Date用作因子列:

lm(Value ~ factor(Date), data=sfshort)