使用Excel在`as.POSIXct`中的数据差异

时间:2015-07-27 07:35:54

标签: r excel datetime time

我的实际数据如下:

8/8/2013 15:10
7/26/2013 10:30
7/11/2013 14:20
3/28/2013 16:15
3/18/2013 15:50

当我从excel文件中读取它时,R将其读作:

41494.63
41481.44
41466.60
41361.68
41351.66

所以我用as.POSIXct(as.numeric(x[1:5])*86400, origin="1899-12-30",tz="GMT")得到了:

2013-08-08 15:07:12 GMT
2013-07-26 10:33:36 GMT
2013-07-11 14:24:00 GMT
2013-03-28 16:19:12 GMT
2013-03-18 15:50:24 GMT

为什么时间有差异?如何克服它?

4 个答案:

答案 0 :(得分:7)

问题是Excel的R是将数字四舍五入为两位小数。当您将带有8/8/2013 15:10的单元格转换为文本格式(在Mac OSX上的Excel中)时,您会得到数字41494.63194

使用时:

as.POSIXct(41494.63194*86400, origin="1899-12-30",tz="GMT")

它会给你:

[1] "2013-08-08 15:09:59 GMT"

这比原始日期减少了1秒(这也表明41494.63194四舍五入为五位小数。)

可能最好的解决方案是将excel文件导出到.csv或以制表符分隔的.txt文件,然后将其读入R.这至少给出了正确的日期:< / p>

> df
            datum
1  8/8/2013 15:10
2 7/26/2013 10:30
3 7/11/2013 14:20
4 3/28/2013 16:15
5 3/18/2013 15:50

答案 1 :(得分:3)

鉴于

x <- c("8/8/2013 15:10","7/26/2013 10:30","7/11/2013 14:20","3/28/2013 16:15","3/18/2013 15:50")

(读作字符向量),

x <- as.POSIXct(x, format = "%m/%d/%Y %H:%M", tz = "GMT")

它正确地作为POSIXct向量读取给我。

答案 2 :(得分:2)

也许这是R如何读取数据的问题。这里只有lubridate的示例似乎运作良好。

x <- "8/8/2013 15:10"
library(lubridate)
dmy_hm(x, tz = "GMT")
[1] "2013-08-08 15:10:00 GMT"

答案 3 :(得分:2)

这是它在Windows系统上的工作原理。这就是源Excel 2010文件的样子:

PHAssetCreationRequest

为什么这个不变?首先,因为Excel和Office在处理日期时通常是一团糟。说真的,请看这里:Why is 1899-12-30 the zero date in Access / SQL Server instead of 12/31?

date num secs constant Rtime (mm/dd/yyyy) (in Excel) (num*86400) (Windows) (secs-constant) 08/08/2013 15:10 41494.63 3585136200 2209161600 1375974600 07/26/2013 10:30 41481.44 3583996200 2209161600 1374834600 11/07/2013 14:20 41585.60 3592995600 2209161600 1383834000 03/28/2013 16:15 41361.68 3573648900 2209161600 1364487300 03/18/2013 15:50 41351.66 3572783400 2209161600 1363621800 Rtime <- c(1375974600,1374834600,1383834000,1364487300,1363621800) as.POSIXct(Rtime,origin="1970-01-01",tz="GMT") #[1] "2013-08-08 15:10:00 GMT" "2013-07-26 10:30:00 GMT" #[3] "2013-11-07 14:20:00 GMT" "2013-03-28 16:15:00 GMT" #[5] "2013-03-18 15:50:00 GMT" 是1970-01-01和1899-12-30的2209161600开始之间的秒数差异,这是Windows上Excel中的0分。

POSIXct