我很难将日期从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 ...
答案 0 :(得分:2)
首先,确保使用完整年份(不仅仅是最后2个数字),以明确的格式在文件中显示日期。 %Y
适用于“年份与世纪”(请参阅?strptime
),但您似乎没有世纪。因此,您可以使用%y
(风险自负,再次查看?strptime
)或在Excel中重新格式化日期。
在读取这些数据时,将as.is=TRUE
与read.csv
一起使用也是一个好主意 - 否则,字符向量会转换为可能导致意外结果的因素。
在Wndows上,使用RODBC直接从xls
或xlsx
文件中读取日期可能会更容易。
以下内容可能会提示:
> 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")