`as.POSIXct` 与 Excel 的数据差异
data difference in `as.POSIXct` with Excel
我的实际数据是这样的:
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
为什么会有时间上的差异?如何克服?
给出
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 向量。
可能是R如何读取数据的问题。这里只是一个 lubridate
的例子似乎效果很好。
x <- "8/8/2013 15:10"
library(lubridate)
dmy_hm(x, tz = "GMT")
[1] "2013-08-08 15:10:00 GMT"
问题是 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。这让我在至少正确的日期:
> 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
这就是它在 Windows 系统上的工作方式。这是源 Excel 2010 文件的样子:
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"
为什么这个常量?首先,因为 Excel 和 Office 在处理日期时通常是一团糟。说真的,看这里:Why is 1899-12-30 the zero date in Access / SQL Server instead of 12/31?
2209161600
是1970-01-01的POSIXct
开始和1899-12-30之间的秒差,也就是Excel上的0点Windows。
dput(as.POSIXct(2209161600,origin="1899-12-30",tz="GMT"))
#structure(0, tzone = "GMT", class = c("POSIXct", "POSIXt"))
我的实际数据是这样的:
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
为什么会有时间上的差异?如何克服?
给出
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 向量。
可能是R如何读取数据的问题。这里只是一个 lubridate
的例子似乎效果很好。
x <- "8/8/2013 15:10"
library(lubridate)
dmy_hm(x, tz = "GMT")
[1] "2013-08-08 15:10:00 GMT"
问题是 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。这让我在至少正确的日期:
> 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
这就是它在 Windows 系统上的工作方式。这是源 Excel 2010 文件的样子:
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"
为什么这个常量?首先,因为 Excel 和 Office 在处理日期时通常是一团糟。说真的,看这里:Why is 1899-12-30 the zero date in Access / SQL Server instead of 12/31?
2209161600
是1970-01-01的POSIXct
开始和1899-12-30之间的秒差,也就是Excel上的0点Windows。
dput(as.POSIXct(2209161600,origin="1899-12-30",tz="GMT"))
#structure(0, tzone = "GMT", class = c("POSIXct", "POSIXt"))