Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将日期从excel转换为R_R_Excel_Date - Fatal编程技术网

将日期从excel转换为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

我很难将日期从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  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,感谢您建议的链接。现在它可以很好地转换日期。谢谢。