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

Posted

技术标签:

【中文标题】R中从POSIXct到日期的日期转换【英文标题】:Date conversion from POSIXct to Date in R 【发布时间】:2013-05-09 13:14:11 【问题描述】:

谁能告诉我为什么 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 07:00POSIXct转换为Date后不应该是2013-01-01吗,有什么办法可以将截止从08:00更改为00:00

更新 #1

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

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

【问题讨论】:

这里有一个类似的问题和答案可能会感兴趣:***.com/questions/62743019/… 【参考方案1】:

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

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

来自?as.Date()

["POSIXct" is] 通过忽略午夜之后的时间转换为天 在指定时区的时间表示中,默认UTC

【讨论】:

【参考方案2】:

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

【讨论】:

在暗示夏令时后值得一提的是,有时您需要输入 tz="" 才能使其正常工作。我真的不知道为什么,我只是不惜一切代价避免POSIXct 这是最好的答案(并且应该得到绿色勾号),因为它对日期中应用的 tz 参数(不是as.POSIXct)更加彻底和准确,而不是OP的绿色勾号答案.【参考方案3】:

当同期 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,然后再转到日期:as.Date(as.POSIXlt(x))

以上是关于R中从POSIXct到日期的日期转换的主要内容,如果未能解决你的问题,请参考以下文章

使用输入“2016-09-25 17:13:46.030”将日期和时间从 Excel 转换为 R

如何在R中的数据框中转换日期/时间列

Java中从字符串到sql日期的日期转换给出不同的输出? [复制]

ios中从字符串到NSDate的日期转换

java和postgresql中从日期到长的转换是不一样的

如何找到最高(最新)和最低(最早)日期 [R]