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-like
41494.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-like
41494.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个循环给出了准确的时间。这里的四舍五入肯定是有罪的。