POSIXct 忽略 origin 参数

POSIXct ignore origin parameter

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”)?

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

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

  1. 您的第一个示例解析为默认时区(您当地的时区),因为 ts 参数被忽略。结果,时间被转换为您的当地时间,在您的时区中给出 "2016-05-30 20:15"(看起来像 U.S。东部夏令时):

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

接下来的三个版本给出了 "expected" 时间 ("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 的帮助文件中所述):

    A time zone specification to be used for the conversion, if one is required. System-specific (see time zones), but "" is the current time zone, and "GMT" is UTC (Universal Time, Coordinated). Invalid values are most commonly treated as UTC, on some platforms with a warning.

    换句话说,这次时区被意外设置为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(导致时间值再次转换为您的本地时间) :

    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"