在R语言中将POSIXct日期格式转换为普通日期格式(Date)

61

有人能告诉我为什么 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转换为Date后,对于2013-01-01 07:00,应该是2013-01-01,是否有办法将截止时间从08:00改为00:00

更新 #1

我发现以下方法可以解决我的问题,但不够简单明了。

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

这里有一个类似的问题和答案,可能会引起兴趣:https://dev59.com/Srzpa4cB1Zd3GeqPCgJy#62743807 - G. Grothendieck
3个回答

51

这里的问题在于时区 - 您可以看到您处于 "HKT"。请尝试:

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

来自?as.Date()

将“POSIXct”转换为天数,忽略指定时区中午夜后的时间表示方式中的时间,默认为UTC时区。


35

使用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参数。还有其他的一些令人不愉快的惊喜,比如夏令时。


3
值得一提的是,在提到夏令时之后,有时候你需要加上tz = ""才能使它正常工作。我不太清楚为什么,但我会尽量避免使用POSIXct - Corvus
3
这是最佳答案(应该获得绿色勾)因为它更全面和精确地阐述了在日期中应用tz参数的问题(而不是as.POSIXct),而不是OP标记为绿色的答案。 - user7613376

4

当协调世界时 (UTC) 的时间在您的 POSIXct 日期之前 (您的第三个示例) 或之后时,会发生如先前记录和解释的情况。要自己查看计算过程,请检查控制台上的 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"

我需要更正自己。tz = ""并不总是有效的。如果您从不想更改POSIXct对象x的时区,请直接先转换为POSIXlt,然后再转换为Date: as.Date(as.POSIXlt(x)) - Dan Murphy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接