POSIXct忽略原点参数

时间:2016-07-05 18:26:35

标签: r datetime posixct

R

中的此命令
format(as.POSIXct(15*60,origin="2016-05-31 00:00:00",ts="UTC"),"%Y-%m-%d %H:%M")

给了我这个

"2016-05-30 20:15"

奇怪的是:

format(as.POSIXct(15*60,origin="2016-05-31 00:00:00",ts="UTC","%Y-%m-%d %H:%M"))

给了我预期的结果:

"2016-05-31 00:15:00"

和警告消息,因为未正确放置最后一个括号。

为什么我的第一个命令没有给我预期的结果(即" 2016-05-31 00:15")?

1 个答案:

答案 0 :(得分:1)

您不小心使用ts代替tz作为时区参数。通常情况下,它不会有更多,但时区有一些微妙的可能是痛苦的(特别是如果,像我一样,你只是间歇性地使用日期时间数据,并不得不,不时刷新你的R日期时间知识),也许这值得多一点解释。

检查以下每个示例中的时区。我们只会查看as.POSIXct函数,因为这就是问题所在:

  1. 您的第一个示例解析为默认时区(您的本地时区),因为忽略了ts参数。因此,时间会转换为您所在时区的"2016-05-30 20:15"当地时间(看起来像美国东部夏令时):

    attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", ts="UTC"), "tzone")
    
    [1] ""
    
  2. 接下来的三个版本给出“预期”时间("2016-05-31 00:15:00"),因为在每种情况下时区都设置​​为UTC:

    1. 与上一个示例相同,但tz参数将时区设置为UTC:

      attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC"), "tzone")
      
       [1] "UTC"
      
    2. 在第二个示例中,ts参数再次被忽略。但是,格式字符串被解释为tz参数,因为它是未命名的,tzas.POSIXct参数顺序中的下一个(有效)参数。但是,由于它作为tz参数无效,因此将其解释为GMT(如as.POSIXct的帮助文件中所述):

        

      要用于转换的时区规范(如果需要)。系统特定(参见时区),但“”是当前时区,“GMT”是UTC(世界时,协调)。在某些带有警告的平台上,无效值通常被视为UTC。

      换句话说,这次时区被意外设置为UTC。

      attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", ts="UTC","%Y-%m-%d %H:%M"), "tzone")
      
      [1] "%Y-%m-%d %H:%M"
      

      但请注意,如果我们将参数命名为format语句,则时区将重新解析为您的本地时区而不是GMT(导致时间值再次转换为您的本地时间):< / p>

      attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", ts="UTC", format="%Y-%m-%d %H:%M"), "tzone")
      
      [1] ""
      
    3. 与之前相同,只是我们将ts更改为tz

      attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC","%Y-%m-%d %H:%M"), "tzone")
      
      [1] "UTC"