【问题标题】:Converting dates from excel to R将日期从excel转换为R
【发布时间】:2014-05-27 01:19:22
【问题描述】:

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

【问题讨论】:

  • 首先你应该制作df$date = as.character(df$excel.date),然后再制作df$date = as.Date(df$excel.date,format = "%m/%d/%y"
  • 德克萨斯州。做过某事;结果仍然在这里: 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) [1] NA NA NA "2006-01-05" NA NA
  • 它不应该是 "%d/%m/%y" 而是 "%m/%d/%y" - 7/28/05 是 7 月 28 日。

标签: r excel date


【解决方案1】:

首先,请确保文件中的日期格式明确,使用完整的年份(不仅仅是最后 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"

(所以 as.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"

【讨论】:

  • 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) [1] NA NA NA "2006-01-05" NA NA
  • 在记事本中检查您的 csv 文件 -- 年份是 4 位数字吗?这可能是 excel 保存 csv 文件的方式......如果那里有 4 位数字,那么 R 会读取它。我不知道如何更改 excel 以 csv 格式保存日期的方式——在 excel 帮助中可能有一些内容。或尝试 RODBC - 例如 milanor.net/blog/?p=779
  • 感谢您建议的链接,我最终直接从 excel (data.xlsx) 导入了文件。现在它可以很好地转换日期。谢谢。
【解决方案2】:

您的数据格式为月/日/年,因此

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

应该是

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

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2023-03-05
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多