任何人都可以告诉我为什么R会在下面给出这样的结果:
> as.POSIXct("2013-01-01 08:00")
[1] "2013-01-01 08:00:00 HKT"
> as.Date(as.POSIXct("2013-01-01 08:00"))
[1] "2013-01-01"
> as.POSIXct("2013-01-01 07:00")
[1] "2013-01-01 07:00:00 HKT"
> as.Date(as.POSIXct("2013-01-01 07:00"))
[1] "2012-12-31"
将2013-01-01
转换为POSIXct
Date
之后,2013-01-01 07:00
不应该是08:00
,是否有办法将截距从00:00
更改为{{} 1}}?
我发现以下内容可以解决我的问题,但方式不太整洁
> as.Date(as.character(as.POSIXct("2013-01-01 07:00")))
[1] "2013-01-01"
答案 0 :(得分:32)
这里的问题是时区 - 你可以看到你在"HKT"
。尝试:
as.Date(as.POSIXct("2013-01-01 07:00", 'GMT'))
[1] "2013-01-01"
来自?as.Date()
:
[“
POSIXct
”被忽略午夜后的时间转换为天数 在指定时区的时间表示中,默认UTC
答案 1 :(得分:23)
使用as.Date
的时区参数:
as.Date(as.POSIXct("2013-01-01 07:00",tz="Hongkong"))
#[1] "2012-12-31"
as.Date(as.POSIXct("2013-01-01 07:00",tz="Hongkong"),tz="Hongkong")
#[1] "2013-01-01"
事实上,我建议在使用日期时转换功能时始终使用tz
参数。还有其他令人讨厌的惊喜,例如夏令时。
答案 2 :(得分:0)
当同时的UTC时间在您的POSIXct日期的午夜之前(您的第三个示例)或午夜之后发生时,会发生这种情况,如前所述和记录的那样。要自己查看数学,请在控制台上检查“ as.Date.POSIXct”。默认tz =“ UTC”下的数学是清楚的。在非默认情况下,R本质上调用as.Date.POSIXlt,并且不会发生“日期旅行”。实际上,如果您从“ lt”对象开始,就不会有此问题:
as.Date(as.POSIXlt(“ 2013-01-01 07:00”,tz =“ Hong Kong”))
[1]“ 2013-01-01”
最简单的解决方法是使用tz =“”调用as.Date以强制使用不太麻烦的as.Date.POSIXlt算法:
as.Date(as.POSIXct(“ 2013-01-01 07:00”),tz =“”)
[1]“ 2013-01-01”