将日期从excel转换为R
我很难将日期从excel(从csv读取)转换为R。非常感谢您的帮助 以下是我正在做的:将日期从excel转换为R,r,excel,date,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 head(df$excel.date) [1] 7/28/05
df$date = as.Date(df$excel.date, format = "%d/%m/%Y")
但是,有些日期会被转换,有些则不会。以下是以下内容的输出:
head(df$date)
[1] NA NA NA "0006-01-05" NA NA
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 ...
从csv文件导入的前5个条目如下:
7/28/05
7/28/05
12/16/05
5/1/06
4/21/05
这是以下的输出:
head(df$date)
[1] NA NA NA "0006-01-05" NA NA
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
表示“世纪之年”(请参见?strtime
),但您似乎没有世纪。因此,您可以使用%y
(风险自负,请再次参阅?strtime
)或在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文件中的两位数,而无需询问您。)
-
?strtime
帮助文件指出,使用%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"
x您的数据格式为月/日/年,因此
df$date = as.Date(df$excel.date, format = "%d/%m/%Y")
应该是
df$date = as.Date(df$excel.date, format = "%m/%d/%Y")
首先,你应该把df$date=as.character(df$excel.date)
做成,然后再把df$date=as.date(df$excel.date,format=“%m/%d/%y”Tx.做到了;结果仍然是:df=read.csv(“df.csv”,as.is=TRUE)>df$date=as.character(df$excel.date)>head(df$date)[$date)[][][1]“7/28/05”“7/28/05”“12/16/05”“5/1/06”“4/21/05”“2007年1月25日”>df$date=as.date(df$date,format=“%d/%m/%y”)>head(df$date)[1]NA-NA“2006-01-05”NA-NAit不应为“%d/%m/%y”,而应为“%m/%d/%y”-2005年7月28日为7月28日。excel文件中的日期似乎是明确的(4位年份),我还添加了as.id=TRUE;结果仍然是:df=read.csv(“df.csv”,as.is=TRUE)>df$date=as.character(df$excel.date)>head(df$date)[1]“7/28/05”“7/28/05”“12/16/05”“5/1/06”“4/21/05”“1/25/07”>df$date=as.date(df$date,format=“%d/%m/%y”)>head(df$date$date)[][$date]1]NA“2006-01-05”NA在记事本中检查您的csv文件--年份是4位数字吗?这可能是excel保存csv文件的方式…如果有4位数字,R将读取它。我不知道如何更改excel以csv格式保存日期的方式--excel帮助中可能有某些内容。或者尝试RODBC-例如,我最终导入了f直接从excel(data.xlsx)中创建ile,感谢您建议的链接。现在它可以很好地转换日期。谢谢。