r - 如何将日期格式从 yearmon 更改为 yyyy-mm-dd?

标签 r ggplot2 dataframe quantmod

我的最终目标是将每月标准普尔 500、苏富比和工业生产指数绘制成一个标准化的 ggplot2,包括衰退条。

我通过 quantmod 和 Quandl 收集数据:

#======= LOAD PACKAGES ====================================
library(tseries)
library(quantmod)
library(Quandl)
library(ggplot2)
library(forecast)
library(urca)

#======= DATA IMPORT ======================================
env1 = new.env()
getSymbols("^GSPC", env = env1, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-04-01"))
GSPC = env1$GSPC
gspc.df = data.frame(date=time(GSPC), coredata(GSPC))

env2 = new.env()
getSymbols("BID", env = env2, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-04-01"))
BID = env2$BID
sothebys.df = data.frame(date=time(BID), coredata(BID))

INDPRO <- Quandl("FRED/INDPRO", start_date="1988-06-01",end_date="2013-05-29",type="xts")
indpro.df = data.frame(date=time(INDPRO), coredata(INDPRO))

然后,我将每日数据转换为每月数据:

# Transform data to monthly time series
GSPCM <- to.monthly(GSPC)
gspcm.df = data.frame(date=time(GSPCM), coredata(GSPCM))

BIDM <- to.monthly(BID)
sothebysm.df = data.frame(date=time(BIDM), coredata(BIDM))

INDPROM <- to.monthly(INDPRO)
indprom.df = data.frame(date=time(INDPROM), coredata(INDPROM))

然后,我正在为绘图构建 data.frame:

# Build the dataframe with monthly dates and stock prices to be used in graphing
dfm = data.frame(Date = gspcm.df$date, GSPCM = gspcm.df$GSPC.Adjusted, BIDM = sothebysm.df$BID.Adjusted, INDPROM = indprom.df$INDPRO.Close)

最后,我尝试构建一个带有衰退条的 ggplot2,如所述 (See Link):

recessions.df = read.table(textConnection(
  "Peak, Trough
  1857-06-01, 1858-12-01
  1860-10-01, 1861-06-01
  1865-04-01, 1867-12-01
  1869-06-01, 1870-12-01
  1873-10-01, 1879-03-01
  1882-03-01, 1885-05-01
  1887-03-01, 1888-04-01
  1890-07-01, 1891-05-01
  1893-01-01, 1894-06-01
  1895-12-01, 1897-06-01
  1899-06-01, 1900-12-01
  1902-09-01, 1904-08-01
  1907-05-01, 1908-06-01
  1910-01-01, 1912-01-01
  1913-01-01, 1914-12-01
  1918-08-01, 1919-03-01
  1920-01-01, 1921-07-01
  1923-05-01, 1924-07-01
  1926-10-01, 1927-11-01
  1929-08-01, 1933-03-01
  1937-05-01, 1938-06-01
  1945-02-01, 1945-10-01
  1948-11-01, 1949-10-01
  1953-07-01, 1954-05-01
  1957-08-01, 1958-04-01
  1960-04-01, 1961-02-01
  1969-12-01, 1970-11-01
  1973-11-01, 1975-03-01
  1980-01-01, 1980-07-01
  1981-07-01, 1982-11-01
  1990-07-01, 1991-03-01
  2001-03-01, 2001-11-01
  2007-12-01, 2009-06-01"), sep=',',
colClasses=c('Date', 'Date'), header=TRUE)
recessions.trim = subset(recessions.df, Peak >= min(gspc.df$date))
g.gspc = ggplot(data = dfm) + geom_line(aes(x = Date, y = GSPCM, colour = "blue")) + geom_line(aes(x = Date, y = BIDM, colour = "red")) + geom_line(aes(x = Date, y = INDPROM, colour = "green")) + theme_bw()
g.gspc = g.gspc + geom_rect(data=recessions.trim, aes(xmin=Peak, xmax=Trough, ymin=-Inf, ymax=+Inf), fill='pink', alpha=0.4)
plot(g.gspc)

这里返回如下错误信息:

Don't know how to automatically pick scale for object of type yearmon. Defaulting to continuous. Fehler: Discrete value supplied to continuous scale

我认为这与我的数据框中的日期格式和衰退.df 中的日期格式有关。再次,您的帮助将不胜感激。希望代码不要太长。

附:如果有一种方法可以使用 Quantmod 的 ChartSeries 工具生成包含衰退条的相同图表,那就太棒了...

最佳答案

在 zoo 的开发版本中有直接处理 yearmon 轴的功能(更新:现在作为 zoo 1.7-10 的一部分发布):

library(zoo) # 1.7-10 or higher required
library(ggplot2)
library(scales)

z <- zoo(1:12, Sys.yearmon() + 1:12/12)
autoplot(z) + scale_x_yearmon()

scale_x_yearmon 有一个格式参数,它采用通常的百分比代码。

更新:scale_x_yearmon 现已发布。

关于r - 如何将日期格式从 yearmon 更改为 yyyy-mm-dd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16948669/

相关文章:

python - pandas 获得两列或多列的逐行最小值

r - 如何删除 R 中具有几乎相同列值的行?

r - 我可以使用 optparse 指定强制参数吗

javascript - R Shiny - 最后点击的按钮 ID

R:ggplot在x轴上显示所有日期

python - 如何有效地获取 Pandas DataFrame 中行之间的日志变化率?

r - 具有不同列名称的 for 循环中的 left_join

r - 如何使用 R (ggplot2) 分解圆环图切片

r - 如何在 ggplot geom_area 中强制执行堆栈排序

python - pandas:将具有相同值的连续行分组为一组