从POSIXct到R的日期转换

时间:2013-05-15 04:43:45

标签: r datetime

任何人都可以告诉我为什么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}}?

更新#1

我发现以下内容可以解决我的问题,但方式不太整洁

> as.Date(as.character(as.POSIXct("2013-01-01 07:00")))
[1] "2013-01-01"

3 个答案:

答案 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”