2017-08-08 115 views
-2

我有一年列的數據幀財政年度轉換YYYY-YY到年(日期)

Year 
2001-02 
2002-03 
2003-04 

我怎樣才能將它轉換爲as.Date既保持整個事情或只是第二年即2002,2003,2004。在與%Y轉換,我不可避免地得到2001-08-08,2002-08-08,2003-08-08等

感謝

+2

你爲什麼不只是使用'子(「 - *。」 ,'',Year]'爲第一年或'paste0('20',sub('。* - ','','2001-02'))'爲第二個 – Sotos

+0

'sub(「^(.. )..-(..)$「,」\\ 1 \\ 2「,」2001-02「)爲第二年。 – lmo

+1

只是不要使用日期的正則表達式。他們將永遠不會抓住「4月31日」的事情。只有日期解析器可以,我們有很多。使用它們,並推薦使用它們。 –

回答

1
library(lubridate) 

Year <- c('2001-02', '2002-03', '2003-04') 

year(as.Date(gsub('[0-9]{2}-', '', Year), format = '%Y')) 
+0

最後一列的str是數字。我正在尋找日期格式YYYY或YYYY-YY。 –

+0

日期將始終包括月份和日期。如果你只想要一年,你需要將它作爲數字或字符向量提取。這就是'lubridate'的'year',或者你可以用'format'來獲得它。 AFAIK,你將無法獲得僅僅一年的時間並保持日期類型。 –

0

1)ISOdate明確的問題,因爲它指年終和日期,我們假設輸入是問題中顯示的財政年度(加上我們添加了「1999-00」邊緣案例)以及年終的月份和日期。我們假設所需的輸出是年末對象。 (如果這不是預期的問題,並且您只想將財政年度作爲數字,那麼請參閱最後的註釋。)

回到假設問題,讓我們假設例如3月31日是年終。下面我們使用substring提取Year的前4個字符,將其轉換爲數字並將其加1。然後我們將其與月份和日期一起傳遞給ISODate,最後將其轉換爲日期。沒有使用正則表達式或包。

# test inputs 

month <- 3 
day <- 31 
Year <- c("1999-00", "2001-02", "2002-03", "2003-04") 

# yearends 

as.Date(ISOdate(as.numeric(substring(Year, 1, 4))+1, month, day)) 
## [1] "2000-03-31" "2002-03-31" "2003-03-31" "2004-03-31" 

2)的字符串操作使用相同的輸入的替代解決方案如下。除了我們使用的sub的正則表達式與匹配減號和後面兩個字符的零長度字符串相匹配,轉換爲數字並且加上1之外,其他都類似。然後它使用sprintf格式化字符串,格式爲as.Date可接受的格式;最後適用as.Date。沒有包被使用。

as.Date(sprintf("%d-%d-%d", as.numeric(sub("-..", "", Year))+1, month, day)) 
## [1] "2000-03-31" "2002-03-31" "2003-03-31" "2004-03-31" 

注:如果你只是想財年年底爲數字那麼這將是眼前這個:

as.numeric(substring(Year, 1, 4)) + 1