2013-01-16 133 views
3

感謝您提前給予的幫助。我跟在quantmod包中的getQuote函數,該函數返回以下數據幀的工作:在數據幀列中提取日期的一部分

enter image description here

有修改第一列的所有日期排除時間戳的方式,同時保留數據幀結構?我只想在第一列中輸入「YYYY-MM-DD」。我知道如果它是一個日期向量,我會使用substr(df [,1],1,10)。我還研究了apply函數,其中:apply(df [,1],1,substr,1,10)。

回答

4

另一種選擇沒有提到:

tt <- getQuote("AAPL") 
trunc(tt[,1], units='days') 

它返回POSIXlt的日期。如果你願意,你可以把它包裝在as.POSIXct

+0

+1優雅使用trunc! – agstudy

+0

看起來不錯並且描述性很強,但實際上使用它更醜陋:'tt [,1] = as.POSIXct(trunc(tt [,1],units =「days」))''give me'_'origin'must be supplied_ 「 –

+0

@DarrenCook,嗯,我沒有得到這樣的錯誤。我不是很熟悉quantmod。當你執行'str(tt)'時,是'POSIXct'中的第一個'Trade Time'列嗎? –

2

使用?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" 
+0

'as.POSIXct'採用格式參數如果你想要一個'POSIXct'對象,你不需要'strptime'。 –

+0

這看起來不錯,我也看到了strptime。但是,我如何將其應用於整個數據框?爲多個股票?例如:apply(tt [,1],1,strptime,format ='%Y-%m-%d') – jonnie

+0

@ user1499626你不需要申請,只需使用它就可以了 – rrs

2

我會做到這一點與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="-") 

有可能是打印日期的更優雅的方式,但是這是第一次來找我。

+0

你不應該在'ymd_hms'中需要'as.character' - 即使它是一個因素,lubridate也應該自動強制。 – hadley

+0

嗨@哈德利,我是一個很大的粉絲和水稻校友!我嘗試了沒有as.character,它給了我一個錯誤:'在parse_date_time錯誤(日期,訂單,tz = tz,locale = locale,quiet = quiet):沒有格式可以從訓練集中被傳遞。'' getQuote'函數返回'POSIXct'。 – rrs

+0

酷!如果它已經是'POSIXct',那麼你可以完全跳過'ymd_hms'步驟。 – hadley

0

您可以使用gsub。無需轉換數據類型。

tt <- getQuote("AAPL") 
tt[, 'Trade Time']<- gsub(" [0-9]{2}:[0-9]{2}:[0-9]{2}", "", tt[, 'Trade Time']) 
0

它可以是簡單的:

tt[,1]=as.Date(tt[,1]) 

(其中TT是tt <- getQuote("AAPL"),如在備選答案示出)

逗號之前的空白表示「做所有行 「,逗號後的1表示」(僅)第一列「。

我更喜歡這個解決方案,因爲它給了你一個Date對象,如果你試圖去掉時間戳,它必須正是你想要的。

agstudy的回答給你一個日期帶有一個時區,這會讓你第一次在不同的時區運行你的腳本。 (另外:由於我的測試代碼中有一個微妙的時區假設,我在聖誕節期間在英國運行它時在單元測試套件中得到了一些迴歸。)