将日期从excel转换为R.

时间:2014-04-12 22:51:41

标签: r excel date

我很难将日期从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 ...

2 个答案:

答案 0 :(得分:2)

首先,确保使用完整年份(不仅仅是最后2个数字),以明确的格式在文件中显示日期。 %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"

(所以.Date实际上可以处理因素 - 魔法发生在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"

答案 1 :(得分:1)

您的数据格式为月/日/年,所以

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

应该是

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