簡體   English   中英

將因子轉換為日期(年月)

[英]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()

Sagarstatoptim已經建議使用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"
  • 更新/評論,因為我沒有足夠的聲譽來對Uwe Block的答案發表評論。 我發現“%b”(或超過一個月的縮寫)在使用其他語言作為操作系統語言的計算機上不起作用。 它可以在另一台以英語作為OS語言的計算機上工作。 我確實是因為語言問題而發布了問題。 我建議將其轉換為月份的數值以繞過語言問題,而不是因為轉換為基准日期對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM