【问题标题】:How to get the beginning of the day in POSIXct如何在 POSIXct 中获得一天的开始
【发布时间】:2016-03-01 10:15:33
【问题描述】:

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

我如何在当地时间POSIXct 获得一天的开始?

我的困惑可能来自 R 将其视为 2016-03-01 的结束日期这一事实?鉴于 R 使用 ISO 8601?

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

as.POSIXct(Sys.Date(), tz = "CET")
"2016-03-01 01:00:00 CET"

哪个不正确 - 但还有其他方法吗?

我知道我可以用一个简单的方法破解我的出路

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

但是必须有更正确的方法来做到这一点?优选碱基R。

【问题讨论】:

  • 添加了 tz,只是为了清楚 - 它们不是问题。问题是 R 将 00:00:00 计数到前一天,而不是当前。

标签: r timezone posixct


【解决方案1】:

这是一个命令——但你想要as.POSIXlt()

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> 

只有在转换为 POSIXct 时,时区偏移到 UTC(对我来说是六个小时)才会进入:

R> as.POSIXct(Sys.Date())
[1] "2016-03-01 18:00:00 CST"
R> 

不用说通过包装你得到所需的typevalue

R> as.POSIXct(as.POSIXlt(Sys.Date()))
[1] "2016-03-02 UTC"
R> 

再次归档,无需 lubridate 或其他非 Base R 软件包。

【讨论】:

    【解决方案2】:

    尽管您可以理解地更喜欢 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"
    

    来自?floor_date

    floor_date 采用日期时间对象并将其向下舍入到最接近的值 指定时间单位的整数值。

    非常方便。

    【讨论】:

      【解决方案3】:

      你的例子有点不清楚。

      您说的是一天开始时有 1 分钟的差异,但您的示例显示由于时区而存在 1 小时的差异。

      你可以试试

      ?POSIXct  
      

      解释功能。

      在 POSIXct 中使用 Sys.Date() 会以某种方式覆盖您的时区设置。

      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 实际上是一天的开始。您可以从以下2个不等式的结果得出结论

      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”

      【讨论】:

      • 不,POSIXct 有一个时区属性。它并不总是在UTC。只需注意使用as.POSIXcttz 参数。
      • 你是对的,但这不是我要说的。显然,自 1970 年 1 月 1 日(UTC 时区)以来,内部表示以秒为单位。这是否意味着新一天的开始时间是 00:00:00 UTC?这可以解释 Lasse 的观察结果。
      • 编辑了我的原始答案并删除了大部分 UTC 引用,因为潜在问题似乎与 Sys.Date() 与 as.POSIXct 和 not 与 UTC 结合使用。
      • DatePOSIXct 的转换是通过POSIXlt 完成的。试试as.POSIXct(as.POSIXlt(Sys.Date(), tz="EET"), tz="EET")
      • 你说得对。然而,最里面的时区是不必要的,因为 Sys.Date() 以某种方式覆盖了时区。
      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2011-11-03
      • 2012-01-28
      • 2014-06-29
      相关资源
      最近更新 更多