从POSIXct到R中日期的日期转换

pb3s4cty  于 2023-02-20  发布在  其他
关注(0)|答案(3)|浏览(123)

谁能告诉我为什么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"

在将POSIXct转换为2013-01-01 07:00Date之后,它不应该是2013-01-01吗?有没有办法将截止值从08:00更改为00:00

更新#1

我发现下面的方法可以解决我的问题,但方法不那么简洁

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

brccelvz1#

这里的问题是时区-你可以看到你在"HKT"

as.Date(as.POSIXct("2013-01-01 07:00", 'GMT'))
[1] "2013-01-01"

?as.Date()开始:
[”POSIXct“]通过忽略指定时区(默认为UTC)时间表示中午夜之后的时间,转换为天数

xmakbtuz

xmakbtuz2#

使用时区参数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参数,还有其他令人讨厌的意外,例如夏令时。

piv4azn7

piv4azn73#

当同期UTC时间早于(您的第三个示例)或在POSIX日期的午夜之后。要亲自查看数学,请在控制台检查as.Date.POSIXct。默认tz="UTC"下的数学是清楚的。在非默认情况下,R实际上调用as.Date.POSIXlt,并且date-travel不会发生。实际上,如果你从lt对象开始你就不会有这个问题:

> as.Date(as.POSIXlt("2013-01-01 07:00", tz = "Hongkong"))  
[1] "2013-01-01"

最简单的解决方法是使用tz=""调用as.Date,以强制使用不太麻烦的as.Date.POSIXlt算法:

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

相关问题