R 如何在POSIXct中开始一天

R 如何在POSIXct中开始一天,r,timezone,posixct,R,Timezone,Posixct,我的一天从2016-03-02 00:00:00开始。不2016-03-02 00:00:01 如何在当地时间的POSIXct中开始一天 我的困惑可能是因为R认为这是2016-03-01的结束日期?假设R使用ISO 8601 例如,如果我尝试使用Sys.Date()查找一天的开始: 这是不正确的,但还有其他方法吗 我知道我可以用一个简单的 as.POSIXct(paste(Sys.Date(), "00:00:00", sep = " "), tz = "CET") 但必须有一个更正确的方法来

我的一天从2016-03-02 00:00:00开始。不
2016-03-02 00:00:01

如何在当地时间的
POSIXct
中开始一天

我的困惑可能是因为R认为这是2016-03-01的结束日期?假设R使用ISO 8601

例如,如果我尝试使用Sys.Date()查找一天的开始:

这是不正确的,但还有其他方法吗

我知道我可以用一个简单的

as.POSIXct(paste(Sys.Date(), "00:00:00", sep = " "), tz = "CET")

但必须有一个更正确的方法来做到这一点?基础R优先

你的例子有点不清楚

您所说的是一天开始时相差1分钟,但您的示例显示,由于时区的不同,相差1小时

你可以试试

?POSIXct  
来解释功能

将Sys.Date()与POSIXct一起使用会以某种方式覆盖您的时区设置

as.POSIXct(Sys.Date(), tz="EET")  
 "2016-03-01 01:00:00 CET"  
当输入字符串时

as.POSIXct("2016-03-01 00:00:00", tz="EET")  
 "2016-03-01 EET"
看起来00:00:00实际上是一天的开始。您可以从以下两个不等式的结果得出结论

as.POSIXct("2016-03-02 00:00:02 CET")>as.POSIXct("2016-03-02 00:00:01 CET")
真的

as.POSIXct("2016-03-02 00:00:01 CET")>as.POSIXct("2016-03-02 00:00:00 CET")
真的

所以这是一个时区问题。请注意,00:00:00将自动从as.POSIXct结果中删除

as.POSIXct("2016-03-02 00:00:00 CET")

“2016-03-02 CET”

尽管您可以理解地更喜欢base R,“智能方式”,对于“智能”的某些含义,将是:

library(lubridate)
x <- floor_date(Sys.Date(),"day")

> format(x,"%Y-%m-%d-%H-%M-%S")
[1] "2016-03-02-00-00-00"
库(lubridate)
x格式(x,“%Y-%m-%d-%H-%m-%S”)
[1] "2016-03-02-00-00-00"
?楼层\u日期起

floor_date接受一个日期时间对象,并将其向下舍入到最近的值 指定时间单位的整数值

非常方便。

这是一个命令,但您希望
作为.POSIXlt()

只有在转换为
POSIXct
时,时区偏移量才会进入UTC(我为六小时):

不用说,通过包装两者,您可以获得所需的类型和值:


再次以不需要lubridate或其他非基本R软件包的形式提交。

否,
POSIXct
具有时区属性。它并不总是在UTC。只需注意使用
as.POSIXct
tz
参数。你是对的,但我不是这么说的。显然,自1970年1月1日(UTC时区)以来,内部表示以秒为单位。这难道不意味着新一天的开始时间是UTC的00:00:00吗?这可以解释Lasse的观察结果。编辑了我的原始答案并删除了大部分UTC参考,因为根本问题似乎是Sys.Date()与as.POSIXct结合,而不是UTC。从
Date
POSIXct
的转换是通过
POSIXlt
完成的。试试
as.POSIXct(as.POSIXlt(Sys.Date(),tz=“EET”),tz=“EET”)
。你说得对。但是,最里面的时区是不必要的,因为Sys.Date()以某种方式覆盖了timezone.added tz,只是为了澄清一点,它们不是问题所在。问题是R计算的是前一天的00:00:00,而不是当前。
library(lubridate)
x <- floor_date(Sys.Date(),"day")

> format(x,"%Y-%m-%d-%H-%M-%S")
[1] "2016-03-02-00-00-00"
R> as.POSIXlt(Sys.Date())
[1] "2016-03-02 UTC"
R> format(as.POSIXlt(Sys.Date()), "%Y-%m-%d %H:%M:%S")
[1] "2016-03-02 00:00:00"
R> 
R> as.POSIXct(Sys.Date())
[1] "2016-03-01 18:00:00 CST"
R> 
R> as.POSIXct(as.POSIXlt(Sys.Date()))
[1] "2016-03-02 UTC"
R>