簡體   English   中英

將日期從Excel轉換為R

[英]Converting dates from excel to R

我很難將日期從excel(從csv讀取)轉換為R。非常感謝幫助。

這是我在做什么:

df$date = as.Date(df$excel.date, format = "%d/%m/%Y")

但是,有些日期會轉換,有些則不會。 這是輸出:

head(df$date)
[1] NA           NA           NA           "0006-01-05" NA           NA 

從csv文件導入的前5個條目如下:

7/28/05
7/28/05
12/16/05
5/1/06
4/21/05

這是以下內容的輸出:

head(df$excel.date)
[1] 7/28/05  7/28/05  12/16/05 5/1/06   4/21/05  1/25/07 
1079 Levels: 1/1/00 1/1/02 1/1/97 1/10/96 1/10/99 1/11/04 1/11/94 1/11/96 1/11/97 1/11/98 ... 9/9/99

str(df)
.
.
$ excel.date   : Factor w/ 1079 levels "1/1/00","1/1/02",..: 869 869 288 618 561 48 710 1022 172 241 ...

首先,請確保您使用完整的年份(而不只是最后兩個數字)以明確的格式保存文件中的日期。 %Y表示“有世紀的年份” (請參閱?strptime ),但是您似乎沒有世紀。 因此,您可以使用%y (風險自負,請再次查看?strptime )或重新格式化Excel中的日期。

另外,也使用一個好主意as.is=TRUEread.csv在這些數據讀出時-否則字符向量轉換到因素可導致意想不到的結果。

在Wndows上,使用RODBC直接從xlsxlsx文件中讀取日期可能更容易。

(編輯)

以下內容可能會提示:

> as.Date("13/04/2014", format= "%d/%m/%Y")
[1] "2014-04-13"
> as.Date(factor("13/04/2014"), format= "%d/%m/%Y")
[1] "2014-04-13"
> as.Date(factor("13/04/14"), format= "%d/%m/%Y")
[1] "14-04-13"
> as.Date(factor("13/04/14"), format= "%d/%m/%y")
[1] "2014-04-13"

(因此as.Date實際上可以處理各種因素- as.Date.factor發生在as.Date.factor方法中,定義為:

function (x, ...)  as.Date(as.character(x), ...)

將日期表示為因素不是一個好主意,但在這種情況下也不是問題。 我認為問題是excel,可將您的年份另存為CSV文件中的2位數字,而無需詢問。)

-

?strptime幫助文件說,使用%y是特定於平台的-您可以在不同的計算機上獲得不同的結果。 因此,如果沒有辦法返回源並以更好的方式保存csv,則可以使用以下內容:

x <- c("7/28/05", "7/28/05", "12/16/05", "5/1/06", "4/21/05", "1/25/07")

repairExcelDates <- function(x, yearcol=3, fmt="%m/%d/%Y") {
 x <-  do.call(rbind, lapply(strsplit(x, "/"), as.numeric))
 year <- x[,yearcol]
 if(any(year>99)) stop("dont'know what to do")
 x[,yearcol] <- ifelse(year <= as.numeric(format(Sys.Date(), "%Y")), year+2000, year + 1900) 
 # if year <= current year then add 2000, otherwise add 1900
 x <- apply(x, 1, paste, collapse="/")
 as.Date(x, format=fmt)
 }

repairExcelDates(x)
# [1] "2005-07-28" "2005-07-28" "2005-12-16" "2006-05-01" "2005-04-21"
# [6] "2007-01-25"

您的數據格式為月/日/年,因此

df$date = as.Date(df$excel.date, format = "%d/%m/%Y")

應該

df$date = as.Date(df$excel.date, format = "%m/%d/%Y")

暫無
暫無

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

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