提前感谢您的帮助。我正在使用 quantmod 包中的 getQuote 函数,它返回以下数据框:
有没有办法修改第一列中的所有日期以排除时间戳,同时保留数据框结构?我只想要第一列中的“YYYY-MM-DD”。我知道如果它是日期向量,我会使用 substr(df[,1],1,10)。我还研究了 apply 函数:apply(df[,1],1,substr,1,10)。
另一个尚未提及的选项:
tt <- getQuote("AAPL")
trunc(tt[,1], units='days')
这将返回 中的日期POSIXlt
。as.POSIXct
如果你愿意,你可以把它包起来。
使用?strptime
tt <- getQuote("AAPL")
tt[,1]
[1] "2013-01-16 02:52:00 CET"
as.POSIXct(strptime(tt[,1],format ='%Y-%m-%d')) ## as.POSIXct because strptime returns POSIXlt
[1] "2013-01-16 CET"
编辑
您可以使用 POSIXct 的格式参数,但您需要先将 tt[,1] 转换为字符。
as.POSIXct(as.character(tt[,1]),format ='%Y-%m-%d')
[1] "2013-01-16 CET"
我会这样做lubridate
library(plyr)
library(lubridate)
tickers <- c("AAPL","AAJX","ABR")
df <- ldply(tickers, getQuote)
rownames(df) <- tickers
df[,"Trade Time"] <- paste(year(df[,"Trade Time"]),month(df[,"Trade Time"]),day(df[,"Trade Time"]),sep="-")
打印日期可能有一种更优雅的方式,但这是我首先想到的。
您可以只使用 gsub。无需转换数据类型。
tt <- getQuote("AAPL")
tt[, 'Trade Time']<- gsub(" [0-9]{2}:[0-9]{2}:[0-9]{2}", "", tt[, 'Trade Time'])
它可以很简单:
tt[,1]=as.Date(tt[,1])
(其中 tt 是tt <- getQuote("AAPL")
,如替代答案所示)
逗号前的空格表示“执行所有行”,逗号后的 1 表示“对(仅)第一列进行操作”。
我更喜欢这个解决方案,因为它为您提供了一个 Date 对象,如果您试图剥离时间戳,它必须正是您想要的。
agstudy 的回答给你一个带有 timezone的日期,当你第一次在不同的时区运行你的脚本时,这会咬你。(顺便说一句:由于我的测试代码中有一个微妙的时区假设,我在圣诞节期间在英国运行单元测试套件时遇到了一些回归。)