R “as.POSIXct”与Excel中的数据差异
我的实际数据如下所示:R “as.POSIXct”与Excel中的数据差异,r,excel,datetime,time,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 date num secs constant Rtime (mm/dd/yyyy) (in Excel) (num*86400) (Windows) (secs-constant) 08/08/2013 15:10 414
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
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文件中读取时,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给定
x也许这是R如何读取数据的问题。仅举一个使用lubridate
的例子就可以了
x <- "8/8/2013 15:10"
library(lubridate)
dmy_hm(x, tz = "GMT")
[1] "2013-08-08 15:10:00 GMT"
x也许这是R如何读取数据的问题。仅举一个使用lubridate
的例子就可以了
x <- "8/8/2013 15:10"
library(lubridate)
dmy_hm(x, tz = "GMT")
[1] "2013-08-08 15:10:00 GMT"
x问题是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
问题是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文件的外观:
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
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"
这就是它在Windows系统上的工作原理。这是源Excel 2010文件的外观:
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
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"
由于OP指定了tz
参数,我认为最好不要忘记它,因为在我们居住的意大利x
将CEST
作为时区。在我的情况下,x@kavi-你应该指定你在你的问题中使用Excel-这会有所不同,因为Excel在处理日期时很疯狂。好的!很抱歉让问题看起来不一样。我做了改变。我不明白这个答案如何回答这个问题。因为OP指定了tz
参数,我认为最好不要忘记它,因为在我们居住的意大利x
将CEST
作为时区。在我的情况下,x@kavi-你应该在你的问题中指定你使用的是Excel-这会有所不同,因为Excel在处理日期方面是个疯子。好的!很抱歉让问题看起来不一样。我做了更改。我不明白这个答案是如何回答这个问题的。我不确定这里的答案是什么,但也许可以试试这个as.POSIXct(x*60*60*24,tz=“GMT”,origin=“1900-01-01”)
如果这是你的x:x@davidernburg,但分钟不正确。@David如果我更改日期,我的结果日期也会更改。但在上述情况下,结果日期是正确的。我的问题是只有几分钟。哦,我没看到你已经试过了。不管怎样,这是一条路要走,它可能是Excel在那里搞乱了一些事情。你必须调整它以满足你的需要。在这一点上,Kavi你能分享一下你是如何将数据加载到R中的吗?我很想知道像8/8/2013 15:10这样的原始数据是如何在R-like41494.63
中读取的。谢谢。我不确定这里的答案是什么,但也许可以试试这个as.POSIXct(x*60*60*24,tz=“GMT”,origin=“1900-01-01”)
如果这是你的x:x@DavidArenburg,但会议记录不正确。@David如果我更改日期,我的结果日期也会更改。但在上述情况下,结果日期是正确的。我的问题是只有几分钟。哦,我没看到你已经试过了。不管怎样,这是一条路要走,它可能是Excel在那里搞乱了一些事情。你必须调整它以满足你的需要。在这一点上,Kavi你能分享一下你是如何将数据加载到R中的吗?我很想知道像8/8/2013 15:10这样的原始数据是如何在R-like41494.63
中读取的。谢谢。我想这也不能回答这个问题。@Davidernburg我认为你是对的,但OP的最后一个问题是“如何克服它?”然后我使用lubridate
提供了一种克服这个问题的方法。一种务实的方法,不解释问题发生的原因,但允许OP解决问题。我相信一个超级R用户会解决这个问题,并获得大量的支持票。但OPs输入的是一个数字,比如41494.63
,而不是“8/8/2013 15:10”
@davidernburg。。。嗯。。。我认为你是对的。此时,为了更好地理解正在发生的事情,OP可能必须与用户共享他/她用于读取数据的代码。我会问。我想这也不能回答这个问题。@DavidArenburg我认为你是对的,但OP的最后一个问题是“如何克服它?”然后我使用lubridate
提供了一种克服这个问题的方法。一种务实的方法,不解释问题发生的原因,但允许OP解决问题。我相信一个超级R用户会解决这个问题,并获得大量的支持票。但OPs输入的是一个数字,比如41494.63
,而不是“8/8/2013 15:10”
@davidernburg。。。嗯。。。我认为你是对的。此时,为了更好地理解正在发生的事情,OP可能必须与用户共享他/她用于读取数据的代码。我会问的。41494.63194
最后4次循环给出了准确的时间。这里的四舍五入肯定是有罪的。41494.63194
最后4个循环给出了准确的时间。这里的四舍五入肯定是有罪的。