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
函数,因为那是问题所在:
您的第一个示例解析为默认时区(您当地的时区),因为 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:
与前面的示例相同,除了 tz
参数将时区设置为 UTC:
attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC"), "tzone")
[1] "UTC"
在您的第二个示例中,ts
参数再次被忽略。但是,格式字符串被解释为 tz
参数,因为它未命名并且 tz
是 as.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] ""
与之前相同,只是我们将 ts
更改为 tz
:
attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC","%Y-%m-%d %H:%M"), "tzone")
[1] "UTC"
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
函数,因为那是问题所在:
您的第一个示例解析为默认时区(您当地的时区),因为
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:
与前面的示例相同,除了
tz
参数将时区设置为 UTC:attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC"), "tzone")
[1] "UTC"
在您的第二个示例中,
ts
参数再次被忽略。但是,格式字符串被解释为tz
参数,因为它未命名并且tz
是as.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] ""
与之前相同,只是我们将
ts
更改为tz
:attr(as.POSIXct(15*60,origin="2016-05-31 00:00:00", tz="UTC","%Y-%m-%d %H:%M"), "tzone")
[1] "UTC"