13

我正在xls使用gdata. 我正在转换日期列,as.Date用于转换日期

根据手册as.Date,日期来源取决于平台,因此我正在确定相应地使用哪个来源

.origin <- ifelse(Sys.info()[['sysname']] == "Windows", "1899-12-30", "1904-01-01")
as.Date(myData$Date, origin=.origin)

但是,我想知道是否应该考虑读取文件的平台或写入文件的平台?

对于它的价值,我目前正在一个没有 excel 的 linux 机器上测试代码,并且正确的日期是通过使用origin="1904-01-01"


引用'?as.Date'

  ## date given as number of days since 1900-01-01 (a date in 1989)
  as.Date(32768, origin = "1900-01-01")
  ## Excel is said to use 1900-01-01 as day 1 (Windows default) or
  ## 1904-01-01 as day 0 (Mac default), but this is complicated by Excel
  ## treating 1900 as a leap year.
  ## So for dates (post-1901) from Windows Excel
  as.Date(35981, origin = "1899-12-30") # 1998-07-05
  ## and Mac Excel
  as.Date(34519, origin = "1904-01-01") # 1998-07-05
  ## (these values come from http://support.microsoft.com/kb/214330)

4

2 回答 2

5

你可以试试(非常)新的 exell 包:https ://github.com/hadley/exell 。它将 Excel 日期加载到 POSIXct 中,根据文件是由 Windows 还是 Mac Excel 编写的,正确选择原点。

于 2015-03-17T11:22:56.173 回答
3

是的,您应该考虑文件的写入位置。Excel-Windows 似乎能够区分 Mac 编写的日期和 Win 编写的日期,但您得到的证据表明这些是源自 Mac 的 .xls 文件。

最安全的方法是在输入数据的 Excel 版本中工作,并使用格式菜单打开一个对话框,从中选择 as-Date 和自定义格式 yyyy-mm-dd。然后另存为 csv 文件,您将能够在适当的列位置使用 colClasses 向量“Date”导入 R。但这听起来好像是一个不可用的选项。

我想它不适用于您在 linux 机器上,所以这只是一个 Mac-whine:gdata-package 给出弃用警告,然后无法在 R 3.0.0 上安装 XLSX 支持文件,而普通的 Perl 5.8 安装在'/opt/local/bin/perl'。尽管 'gdata::findPerl' 能够成功找到它。

在这一点上,我认为应该将问题重定向到询问您是否可以诱使 gdata 函数检查文件的属性。在查看了 xls 阅读的代码库之后,我相当怀疑它,因为没有看到任何提及检查不同 xls 版本的内容。

在使用 Mac 版本的 Excel 创建的空白 xls 文件的末尾附近,使用文本编辑器查看我看到:

Worksheets˛ˇˇˇˇˇ ¿F$Microsoft Excel 97 - 2004 Worksheet˛ˇˇˇ8FIBExcel.Sheet.8˛ˇ
‡ÖüÚ˘Oh´ë+'≥Ÿ0îHPhħ
∞ºƒ'David WinsemiusDavid WinsemiusMicrosoft Macintosh Excel@ê˚á!Ë+Œ@ê'å-Ë+ŒG»˛ˇˇˇPICT¿Kġ

另一个不同之处在于,Windows 版本的检查方式与将“Excel 2003 工作表”作为工作表类型相同,而 Mac 版本的检查方式是“Excel 97 - 2004”。因此,也许您可​​以强制 R 绕过在扫描“Macintosh”期间读取或 grepping 时触发的所有错误。也许 Linux-R 更能抵抗这种事情?

Error: invalid multibyte string at '<ff>'

我还收到了一堆来自 grep 的警告,表明我可能无法“看到”某些字符串:

Warning message:
In grep("Macintosh", lin) : input string 1 is invalid in this locale

您可能能够从 xls2csv.pl 中的 Perl 代码中劫持一些更强大的代码,该代码是 gdata 包的一部分。

于 2013-03-28T18:47:39.237 回答