![](/img/trans.png)
[英]Convert numeric date format (YYYYMMDD; 20150101) into Year-Month
[英]Convert Factor to Date (Year-Month)
我的資料欄看起來像...
date
<fctr>
14-Jan
14-Feb
14-Mar
15-Jan
只是想知道如何將其轉換為日期,因為當我在此代碼中打孔時,會得到NA
hand$date <- as.Date(hand$date, format = "%y-%b")
date
<fctr>
NA
NA
NA
NA
謝謝您的幫助!
OP已請求將data-frame列中的Year-Mon(每月的無日)轉換為Date,這是一個因素。 如果沒有月份,則日期是不完整的,會產生NA
。
有多種選項可用於處理不完整的日期。
as.Date()
並補充每月的某天 如db所建議的類似形式:
as.Date(paste0(hand$date, "-01"), "%y-%b-%d")
#[1] "2014-01-01" "2014-02-01" "2014-03-01" "2015-01-01"
lubridate::ymd()
lubridate
軟件包的ymd()
函數具有一個truncated
參數來解析不完整的日期:
lubridate::ymd(hand$date, truncated = 1L)
#[1] "2014-01-01" "2014-02-01" "2014-03-01" "2015-01-01"
請注意, lubridate
自動假定為每月的第一天。
zoo::as.yearmon()
和zoo::as.Date()
Sagar和statoptim已經建議使用zoo
包中的as.yearmon()
函數。
Sagan的答案是不完整的,因為as.yearmon()
返回的類為yearmon
但不是Date
的對象:
str(zoo::as.yearmon(hand$date, "%y-%b"))
#Class 'yearmon' num [1:4] 2014 2014 2014 2015
statoptim的答案不必要地復雜,因為yearmon
可以直接強制為Date
:
zoo::as.Date(zoo::as.yearmon(hand$date, "%y-%b"))
#[1] "2014-01-01" "2014-02-01" "2014-03-01" "2015-01-01"
請注意,如果我們尚未預先加載zoo
,則必須使用zoo::as.Date()
,因為基數R的as.Date()
不知道如何處理yearmon
對象。
zoo::as.Date()
默認自動設置為每月的第一天。 frac
參數可用於控制返回每月的哪一天,例如,
zoo::as.Date(zoo::as.yearmon(hand$date, "%y-%b"), frac = 1)
#[1] "2014-01-31" "2014-02-28" "2014-03-31" "2015-01-31"
返回每個月的最后一天。
當前語言環境可能會影響縮寫月份名稱的解釋(在statoptim的答案中可能就是這種情況)。
有一個相關問題的答案 ,建議您查看?as.Date
的示例部分:
## read in date info in format 'ddmmmyyyy'
## This will give NA(s) in some locales; setting the C locale
## as in the commented lines will overcome this on most systems.
## lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- as.Date(x, "%d%b%Y")
## Sys.setlocale("LC_TIME", lct)
z
以下將起作用。
> library(zoo)
> as.yearmon("14-Jan", "%y-%b")
[1] "Jan 2014"
zoo軟件包文檔包含以下示例,該示例在我的R上也返回NA
zoo::as.yearmon("mar07", "%b%y")
我正在使用gsub將“ Jan”替換為“ 01”。 我看到這不是最有效的代碼,但希望它現在對您有幫助。
library(zoo)
df = data.frame(date = c("14-Jan", "14-Feb", "15-Jan"), stringsAsFactors = F)
month.abb
# [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" ....
month.num = substr( paste0("0", c(1:12)), start=c(rep(1,9), rep(2,3)), stop=3)
head(month.num)
# [1] "01" "02" "03" "04" "05" "06"
# can't think of or find ways to vectorize gsub
for(i in 1:12) {
df$date = gsub(df$date, pattern=month.abb[i], replacement=month.num[i])
}
as.Date(as.yearmon(df$date, format = "%y-%m"))
# [1] "2014-01-01" "2014-02-01" "2015-01-01"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.